Remove VMware code

VMware is not supported since Fuel 10

Implements: blueprint remove-vmware

Change-Id: I00b2786efa789ac9206b25b55c19166dbfe7dc4f
This commit is contained in:
Julia Aranovich 2017-02-14 13:09:10 +04:00
parent e2dc8b3f92
commit bdeece64f3
11 changed files with 2 additions and 953 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 829 B

View File

@ -1,23 +0,0 @@
.vmware-tab {
.nova-compute {
h4 .btn-group {
margin-right: 10px;
.btn-link {
padding: 0;
}
}
}
.glyphicon {
margin-left: 3px;
}
.alert {
margin-left: 10px;
margin-right: 10px;
.unassigned-node-list {
list-style: none;
}
.unassigned-node-name {
font-weight: bold;
}
}
}

View File

@ -1,28 +0,0 @@
{
"en-US": {
"translation": {
"cluster_page": {
"tabs": {
"vmware": "VMware"
}
},
"vmware": {
"title": "VMware vCenter Settings",
"availability_zones": "vCenter",
"network": "Network",
"glance": "Glance",
"cinder": "Cinder",
"reset_to_defaults": "Load Defaults",
"cancel": "Cancel Changes",
"apply": "Save Changes",
"nova_computes": "Nova Computes",
"nova_compute": "Nova Compute Instance",
"has_errors": "VMware settings are invalid. For more information please visit the",
"tab_name": "VMware tab",
"duplicate_value": "Duplicate values are not allowed",
"unassigned_nodes": "The following compute-vmware nodes are not assigned to any vCenter cluster:",
"invalid_target_node" : "Invalid target node"
}
}
}
}

View File

@ -1,24 +0,0 @@
/*
* Copyright 2015 Mirantis, 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 VmWareTab from 'plugins/vmware/vmware_tab';
import VmWareModels from 'plugins/vmware/vmware_models';
import translations from 'plugins/vmware/translations.json';
import i18n from 'i18n';
import './styles.less';
i18n.addTranslations(translations);
export {VmWareTab, VmWareModels};

View File

@ -1,318 +0,0 @@
/*
* Copyright 2015 Mirantis, 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 _ from 'underscore';
import i18n from 'i18n';
import Backbone from 'backbone';
import models from 'models';
var VmWareModels = {};
VmWareModels.isRegularField = (field) => {
return _.includes(['text', 'password', 'checkbox', 'select', 'file'], field.type);
};
// models for testing restrictions
var restrictionModels = {};
// Test regex using regex cache
var regexCache = {};
function testRegex(regexText, value) {
if (!regexCache[regexText]) {
regexCache[regexText] = new RegExp(regexText);
}
return regexCache[regexText].test(value);
}
var BaseModel = Backbone.Model
.extend(models.superMixin)
.extend(models.cacheMixin)
.extend(models.restrictionMixin)
.extend({
constructorName: 'BaseModel',
cacheFor: 60 * 1000,
toJSON() {
return _.omit(this.attributes, 'metadata');
},
validate() {
var result = {};
_.each(this.attributes.metadata, (field) => {
if (!VmWareModels.isRegularField(field) || field.type === 'checkbox') {
return;
}
var isDisabled = this.checkRestrictions(restrictionModels, undefined, field);
if (isDisabled.result) {
return;
}
var value = this.get(field.name);
if (field.regex) {
if (!testRegex(field.regex.source, value)) {
result[field.name] = field.regex.error;
}
}
});
return _.isEmpty(result) ? null : result;
},
testRestrictions() {
var results = {
hide: {},
disable: {}
};
var metadata = this.get('metadata');
_.each(metadata, (field) => {
var disableResult = this.checkRestrictions(restrictionModels, undefined, field);
results.disable[field.name] = disableResult;
var hideResult = this.checkRestrictions(restrictionModels, 'hide', field);
results.hide[field.name] = hideResult;
});
return results;
}
});
var BaseCollection = Backbone.Collection
.extend(models.superMixin)
.extend(models.cacheMixin)
.extend({
constructorName: 'BaseCollection',
model: BaseModel,
cacheFor: 60 * 1000,
isValid() {
this.validationError = this.validate();
return this.validationError;
},
validate() {
var errors = _.compact(this.models.map((model) => {
model.isValid();
return model.validationError;
}));
return _.isEmpty(errors) ? null : errors;
},
testRestrictions() {
_.invokeMap(this.models, 'testRestrictions', restrictionModels);
},
invokeMap(path, ...args) {
_.invokeMap(this.models, path, ...args);
}
});
VmWareModels.NovaCompute = BaseModel.extend({
constructorName: 'NovaCompute',
checkEmptyTargetNode() {
var targetNode = this.get('target_node');
if (targetNode.current && targetNode.current.id === 'invalid') {
this.validationError = this.validationError || {};
this.validationError.target_node = i18n('vmware.invalid_target_node');
}
},
checkDuplicateField(keys, fieldName) {
/*jshint validthis:true */
var fieldValue = this.get(fieldName);
if (fieldValue.length > 0 && keys[fieldName] && keys[fieldName][fieldValue]) {
this.validationError = this.validationError || {};
this.validationError[fieldName] = i18n('vmware.duplicate_value');
}
keys[fieldName] = keys[fieldName] || {};
keys[fieldName][fieldValue] = true;
},
checkDuplicates(keys) {
this.checkDuplicateField(keys, 'vsphere_cluster');
this.checkDuplicateField(keys, 'service_name');
var targetNode = this.get('target_node') || {};
if (targetNode.current) {
if (targetNode.current.id && targetNode.current.id !== 'controllers' &&
keys.target_node && keys.target_node[targetNode.current.id]) {
this.validationError = this.validationError || {};
this.validationError.target_node = i18n('vmware.duplicate_value');
}
keys.target_node = keys.target_node || {};
keys.target_node[targetNode.current.id] = true;
}
}
});
var NovaComputes = BaseCollection.extend({
constructorName: 'NovaComputes',
model: VmWareModels.NovaCompute,
validate() {
this._super('validate', arguments);
var keys = {vsphere_clusters: {}, service_names: {}};
this.invokeMap('checkDuplicates', keys);
this.invokeMap('checkEmptyTargetNode');
var errors = _.compact(this.map('validationError'));
return _.isEmpty(errors) ? null : errors;
}
});
var AvailabilityZone = BaseModel.extend({
constructorName: 'AvailabilityZone',
constructor(data) {
Backbone.Model.apply(this, arguments);
if (data) {
this.set(this.parse(data));
}
},
parse(response) {
var result = {};
var metadata = response.metadata;
result.metadata = metadata;
// regular fields
_.each(metadata, (field) => {
if (VmWareModels.isRegularField(field)) {
result[field.name] = response[field.name];
}
});
// nova_computes
var novaMetadata = _.find(metadata, {name: 'nova_computes'});
var novaValues = _.clone(response.nova_computes);
novaValues = _.map(novaValues, (value) => {
value.metadata = novaMetadata.fields;
return new VmWareModels.NovaCompute(value);
});
result.nova_computes = new NovaComputes(novaValues);
return result;
},
toJSON() {
var result = _.omit(this.attributes, 'metadata', 'nova_computes');
result.nova_computes = this.get('nova_computes').toJSON();
return result;
},
validate() {
var errors = _.merge({}, BaseModel.prototype.validate.call(this));
var novaComputes = this.get('nova_computes');
novaComputes.isValid();
if (novaComputes.validationError) {
errors.nova_computes = novaComputes.validationError;
}
return _.isEmpty(errors) ? null : errors;
}
});
var AvailabilityZones = BaseCollection.extend({
constructorName: 'AvailabilityZones',
model: AvailabilityZone
});
VmWareModels.Glance = BaseModel.extend({constructorName: 'Glance'});
VmWareModels.VCenter = BaseModel.extend({
constructorName: 'VCenter',
url() {
return '/api/v1/clusters/' + this.id + '/vmware_attributes' +
(this.loadDefaults ? '/defaults' : '');
},
parse(response) {
if (!response.editable || !response.editable.metadata || !response.editable.value) {
return null;
}
var metadata = response.editable.metadata || [];
var value = response.editable.value || {};
// Availability Zone(s)
var azMetadata = _.find(metadata, {name: 'availability_zones'});
var azValues = _.clone(value.availability_zones);
azValues = _.map(azValues, (value) => {
value.metadata = azMetadata.fields;
return value;
});
// Glance
var glanceMetadata = _.find(metadata, {name: 'glance'});
var glanceValue = _.extend(_.clone(value.glance), {metadata: glanceMetadata.fields});
return {
metadata: metadata,
availability_zones: new AvailabilityZones(azValues),
glance: new VmWareModels.Glance(glanceValue)
};
},
beforeSave() {
this.get('availability_zones').each((availabilityZone) => {
availabilityZone.get('nova_computes').each((novaCompute) => {
novaCompute.set({vsphere_cluster: novaCompute.get('vsphere_cluster').trim()});
});
});
},
isFilled() {
var result = this.get('availability_zones') && this.get('glance');
return !!result;
},
toJSON() {
if (!this.isFilled()) {
return {};
}
return {
editable: {
value: {
availability_zones: this.get('availability_zones').toJSON(),
glance: this.get('glance').toJSON()
}
}
};
},
validate() {
if (!this.isFilled()) {
return null;
}
var errors = {};
_.each(this.get('metadata'), (field) => {
var model = this.get(field.name);
// do not validate disabled restrictions
var isDisabled = this.checkRestrictions(restrictionModels, undefined, field);
if (isDisabled.result) {
return;
}
model.isValid();
if (model.validationError) {
errors[field.name] = model.validationError;
}
});
// check unassigned nodes exist
var assignedNodes = {};
var availabilityZones = this.get('availability_zones') || [];
availabilityZones.each((zone) => {
var novaComputes = zone.get('nova_computes') || [];
novaComputes.each((compute) => {
var targetNode = compute.get('target_node');
assignedNodes[targetNode.current.id] = targetNode.current.label;
});
});
var unassignedNodes = restrictionModels.cluster.get('nodes').filter((node) => {
return _.includes(node.get('pending_roles'), 'compute-vmware') &&
!assignedNodes[node.get('hostname')];
});
if (unassignedNodes.length > 0) {
errors.unassigned_nodes = unassignedNodes;
}
return _.isEmpty(errors) ? null : errors;
},
setModels(models) {
restrictionModels = models;
return this;
}
});
export default VmWareModels;

View File

@ -1,479 +0,0 @@
/*
* Copyright 2015 Mirantis, 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 React from 'react';
import i18n from 'i18n';
import _ from 'underscore';
import dispatcher from 'dispatcher';
import {Input, Tooltip} from 'views/controls';
import {unsavedChangesMixin} from 'component_mixins';
import VmWareModels from 'plugins/vmware/vmware_models';
var Field = React.createClass({
onChange(name, value) {
var currentValue = this.props.model.get(name);
if (currentValue.current) {
currentValue.current.id = value;
currentValue.current.label = value;
} else {
currentValue = value;
}
this.props.model.set(name, currentValue);
this.setState({model: this.props.model});
_.defer(() => dispatcher.trigger('vcenter_model_update'));
},
render() {
var metadata = this.props.metadata;
var value = this.props.model.get(metadata.name);
var children = null;
var props = _.extend({
onChange: this.onChange,
disabled: this.props.disabled,
tooltipText: this.props.tooltipText,
error: (this.props.model.validationError || {})[metadata.name]
}, _.pick(metadata, 'name', 'type', 'label', 'description'));
switch (metadata.type) {
case 'password':
props.value = value;
props.toggleable = true;
break;
case 'radio':
case 'checkbox':
props.checked = value;
break;
case 'select':
props.value = value.current.id;
children = value.options.map((value) => {
return <option key={value.id} value={value.id}>{value.label}</option>;
});
break;
case 'file':
props.key = value && value.name;
props.defaultValue = value;
break;
default:
props.value = value;
break;
}
return (
<Input {...props}>{children}</Input>
);
}
});
var FieldGroup = React.createClass({
render() {
var restrictions = this.props.model.testRestrictions();
var metadata = _.filter(this.props.model.get('metadata'), VmWareModels.isRegularField);
var fields = metadata.map((meta) => {
if (restrictions.hide[meta.name] && restrictions.hide[meta.name].result) {
return null;
}
return (
<Field
key={meta.name}
model={this.props.model}
metadata={meta}
disabled={this.props.disabled || restrictions.disable[meta.name].result}
tooltipText={restrictions.disable[meta.name].message}
/>
);
});
return (
<div>
{fields}
</div>
);
}
});
var GenericSection = React.createClass({
render() {
if (!this.props.model) return null;
return (
<div className='col-xs-12 forms-box'>
<h3>
{this.props.title}
{this.props.tooltipText &&
<Tooltip text={this.props.tooltipText} placement='right'>
<i className='glyphicon glyphicon-warning-sign tooltip-icon' />
</Tooltip>
}
</h3>
<FieldGroup model={this.props.model} disabled={this.props.disabled} />
</div>
);
}
});
var NovaCompute = React.createClass({
render() {
if (!this.props.model) return null;
// add nodes of 'compute-vmware' type to targetNode select
var targetNode = this.props.model.get('target_node') || {};
var nodes = this.props.cluster.get('nodes').filter((node) => node.hasRole('compute-vmware'));
targetNode.options = [];
if (targetNode.current.id === 'controllers' || !this.props.isLocked) {
targetNode.options.push({id: 'controllers', label: 'controllers'});
} else {
targetNode.options.push({id: 'invalid', label: 'Select node'});
}
nodes.forEach((node) => {
targetNode.options.push({
id: node.get('hostname'),
label: node.get('name') + ' (' + node.get('mac').substr(9) + ')'
});
});
this.props.model.set('target_node', targetNode);
return (
<div className='nova-compute'>
<h4>
<div className='btn-group'>
<button
className='btn btn-link'
disabled={this.props.disabled}
onClick={() => {
this.props.onAdd(this.props.model);
}}
>
<i className='glyphicon glyphicon-plus-sign' />
</button>
{!this.props.isRemovable &&
<button
className='btn btn-link'
disabled={this.props.disabled}
onClick={() => {
this.props.onRemove(this.props.model);
}}
>
<i className='glyphicon glyphicon-minus-sign' />
</button>
}
</div>
{i18n('vmware.nova_compute')}
</h4>
<FieldGroup model={this.props.model} disabled={this.props.disabled} />
</div>
);
}
});
var AvailabilityZone = React.createClass({
addNovaCompute(current) {
var collection = this.props.model.get('nova_computes');
var index = collection.indexOf(current);
var newItem = current.clone();
var targetNode = _.cloneDeep(newItem.get('target_node'));
if (this.props.isLocked) {
targetNode.current = {id: 'invalid'};
}
newItem.set('target_node', targetNode);
collection.add(newItem, {at: index + 1});
this.setState({model: this.props.model});
_.defer(() => dispatcher.trigger('vcenter_model_update'));
},
removeNovaCompute(current) {
var collection = this.props.model.get('nova_computes');
collection.remove(current);
this.setState({model: this.props.model});
_.defer(() => dispatcher.trigger('vcenter_model_update'));
},
renderFields() {
var model = this.props.model;
var meta = model.get('metadata');
meta = _.filter(meta, VmWareModels.isRegularField);
return (
<FieldGroup model={model} disabled={this.props.isLocked || this.props.disabled} />
);
},
renderComputes(actions) {
var novaComputes = this.props.model.get('nova_computes');
var isSingleInstance = novaComputes.length === 1;
var disabled = actions.disable.nova_computes;
var cluster = this.props.cluster;
return (
<div className='col-xs-offset-1'>
<h3>
{i18n('vmware.nova_computes')}
</h3>
{novaComputes.map((compute) => {
return (
<NovaCompute
key={compute.cid}
model={compute}
onAdd={this.addNovaCompute}
onRemove={this.removeNovaCompute}
isRemovable={isSingleInstance}
disabled={disabled.result || this.props.disabled}
isLocked={this.props.isLocked}
cluster={cluster}
/>
);
})}
</div>
);
},
render() {
var restrictActions = this.props.model.testRestrictions();
return (
<div>
{this.renderFields(restrictActions)}
{this.renderComputes(restrictActions)}
</div>
);
}
});
var AvailabilityZones = React.createClass({
render() {
if (!this.props.collection) return null;
return (
<div className='col-xs-12 forms-box'>
<h3>
{i18n('vmware.availability_zones')}
{this.props.tooltipText &&
<Tooltip text={this.props.tooltipText} placement='right'>
<i className='glyphicon glyphicon-warning-sign tooltip-icon' />
</Tooltip>
}
</h3>
{this.props.collection.map((model) => {
return <AvailabilityZone
key={model.cid}
model={model}
disabled={this.props.disabled}
cluster={this.props.cluster}
isLocked={this.props.isLocked}
/>;
})}
</div>
);
}
});
var UnassignedNodesWarning = React.createClass({
render() {
if (!this.props.errors || !this.props.errors.unassigned_nodes) return null;
return (
<div className='alert alert-danger'>
<div>
{i18n('vmware.unassigned_nodes')}
</div>
<ul className='unassigned-node-list'>
{
this.props.errors.unassigned_nodes.map((node) => {
return (
<li key={node.id}
className='unassigned-node'>
<span
className='unassigned-node-name'>{node.get('name')}</span>
&nbsp;
({node.get('mac')})
</li>
);
})
}
</ul>
</div>
);
}
});
var VmWareTab = React.createClass({
mixins: [
unsavedChangesMixin
],
statics: {
breadcrumbsPath() {
return [
[i18n('vmware.title'), null, {active: true}]
];
},
isVisible(cluster) {
return cluster.get('settings').get('common.use_vcenter').value;
},
fetchData(options) {
if (!options.cluster.get('vcenter_defaults')) {
var defaultModel = new VmWareModels.VCenter({id: options.cluster.id});
defaultModel.loadDefaults = true;
options.cluster.set({vcenter_defaults: defaultModel});
}
return Promise.all([
options.cluster.get('vcenter').fetch({cache: true}),
options.cluster.get('vcenter_defaults').fetch({cache: true})
]);
}
},
onModelSync() {
this.actions = this.model.testRestrictions();
if (!this.model.loadDefaults) {
this.json = JSON.stringify(this.model.toJSON());
}
this.model.loadDefaults = false;
this.setState({model: this.model});
},
componentDidMount() {
this.clusterId = this.props.cluster.id;
this.model = this.props.cluster.get('vcenter');
this.model.on('sync', this.onModelSync, this); // eslint-disable-line no-sync
this.defaultModel = this.props.cluster.get('vcenter_defaults');
this.defaultsJson = JSON.stringify(this.defaultModel.toJSON());
this.setState({model: this.model, defaultModel: this.defaultModel});
this.model.setModels({
cluster: this.props.cluster,
settings: this.props.cluster.get('settings'),
networking_parameters: this.props.cluster.get('networkConfiguration')
.get('networking_parameters'),
current_vcenter: this.model.get('availability_zones').at(0),
glance: this.model.get('glance')
});
this.onModelSync(); // eslint-disable-line no-sync
dispatcher.on('vcenter_model_update', () => {
if (this.isMounted()) {
this.forceUpdate();
}
});
},
componentWillUnmount() {
this.model.off('sync', null, this);
dispatcher.off('vcenter_model_update');
},
getInitialState() {
return {model: null};
},
readData() {
return this.model.fetch();
},
onLoadDefaults() {
this.model.loadDefaults = true;
this.model.fetch().then(() => {
this.model.loadDefaults = false;
});
},
applyChanges() {
this.model.beforeSave();
return this.model.save();
},
revertChanges() {
return this.readData();
},
hasChanges() {
return this.detectChanges(this.json, JSON.stringify(this.model.toJSON()));
},
detectChanges(oldJson, currentJson) {
var old, current;
try {
old = JSON.parse(oldJson);
current = JSON.parse(currentJson);
} catch (error) {
return false;
}
var oldData = JSON.stringify(old, (key, data) => {
if (key === 'target_node') {
delete data.options;
}
return data;
});
var currentData = JSON.stringify(current, (key, data) => {
if (key === 'target_node') {
delete data.options;
}
return data;
});
return oldData !== currentData;
},
isSavingPossible() {
return !this.state.model.validationError;
},
render() {
if (!this.state.model || !this.actions) {
return null;
}
var model = this.state.model;
var currentJson = JSON.stringify(this.model.toJSON());
var editable = this.props.cluster.isAvailableForSettingsChanges();
this.actions = this.model.testRestrictions();
var hide = this.actions.hide || {};
var disable = this.actions.disable || {};
model.isValid();
var hasChanges = this.detectChanges(this.json, currentJson);
var hasDefaultsChanges = this.detectChanges(this.defaultsJson, currentJson);
var saveDisabled = !hasChanges || !this.isSavingPossible();
var defaultsDisabled = !hasDefaultsChanges;
return (
<div className='row'>
<div className='title'>{i18n('vmware.title')}</div>
<UnassignedNodesWarning errors={model.validationError} />
{!hide.availability_zones.result &&
<AvailabilityZones
collection={model.get('availability_zones')}
disabled={disable.availability_zones.result}
tooltipText={disable.availability_zones.message}
isLocked={!editable}
cluster={this.props.cluster}
/>
}
{!hide.glance.result &&
<GenericSection
model={model.get('glance')}
title={i18n('vmware.glance')}
disabled={!editable || disable.glance.result}
tooltipText={disable.glance.message}
/>
}
<div className='col-xs-12 page-buttons content-elements'>
<div className='well clearfix'>
<div className='btn-group pull-right'>
<button
className='btn btn-default btn-load-defaults'
onClick={this.onLoadDefaults}
disabled={!editable || defaultsDisabled}
>
{i18n('vmware.reset_to_defaults')}
</button>
<button
className='btn btn-default btn-revert-changes'
onClick={this.revertChanges}
disabled={!hasChanges}
>
{i18n('vmware.cancel')}
</button>
<button
className='btn btn-success btn-apply-changes'
onClick={this.applyChanges}
disabled={saveDisabled}
>
{i18n('vmware.apply')}
</button>
</div>
</div>
</div>
</div>
);
}
});
export default VmWareTab;

View File

@ -1814,9 +1814,6 @@ input[type=range] {
&.actions {
.tab-icon-sprite-index(5);
}
&.vmware {
.tab-icon-sprite-index(6);
}
&.dashboard {
.tab-icon-sprite-index(8);
}
@ -2775,7 +2772,6 @@ input[type=range] {
}
&.cisco {.node-logo(cisco);}
&.vbox {.node-logo(vbox);}
&.vmware {.node-logo(vmware);}
&.hp {.node-logo(hp);}
&.xen {.node-logo(xen);}
&.openvz {.node-logo(openvz);}

View File

@ -767,7 +767,6 @@
"locked_settings_alert": "Before proceeding with deployment please verify that the nodes have disk partitioning and network interfaces configured properly. You will not be able to change these via UI after the cloud is deployed.",
"redeployment_alert": "You have made configuration changes which will now be applied to nodes in this environment. Please note that during settings change some services on OpenStack nodes may be restarted, availability of some APIs and resources may be interrupted. For Production clouds, please make sure that the cloud is properly set into maintenance mode prior to performing configuration changes.",
"package_information": "Packages and updates are fetched from the repositories defined in the Settings tab. If your environment uses the default external repositories, verify that the Fuel Master node can access the Internet. If the Fuel Master node is not connected to the Internet, you must set up a local mirror and configure Fuel to upload packages from the local mirror. Fuel must have network access to the local mirror. You may also configure alternate repositories for installation.",
"and_vcenter": "and VCenter",
"neutron_with": "Neutron with",
"horizon": "Horizon",
"horizon_description": "The OpenStack dashboard Horizon is now available.",
@ -1079,14 +1078,8 @@
"compute": {
"title": "Compute",
"qemu": "QEMU-KVM",
"vcenter": "vCenter",
"qemu_description": "Select this option if you want to use QEMU as a hypervisor with capability of KVM acceleration.",
"vcenter_description": "Select this option if you run OpenStack on VMware vCenter.",
"vcenter_warning": "vCenter can't be deployed without QEMU-KVM option selected.",
"qemu_requires_network_backend": "QEMU requires VLAN segmentation or tunneling segmentation network backend enabled",
"vcenter_requires_network_plugins": "Plugin for DVS/NSX is required to create an environment with vCenter and Neutron.",
"vcenter_requires_network_backend": "vCenter requires DVS or NSX network plugins",
"vcenter_plugins_page": "Please visit Fuel plugins page for details.",
"empty_choice": "Please select at least one hypervisor type"
},
"network": {
@ -1094,7 +1087,6 @@
"description": "Choose the private (guest) network configuration. You cannot modify this setting after you complete the wizard. For more information, see the ",
"description_link": "Mirantis OpenStack Planning Guide for Network Topology",
"release_alert": "Neutron is not supported in __NameAndRelease.release_name__",
"hypervisor_alert": "Neutron is not available with vCenter as a selected compute option.",
"neutron_gre_description": "Your network hardware must support GRE segmentation. This option supports up to 65535 networks.",
"neutron_vlan": "Neutron with VLAN segmentation (default)",
"neutron_vlan_description": "Your network hardware must be configured for VLAN segmentation. This option supports up to 4095 networks.",
@ -1963,7 +1955,6 @@
"no_nodes_instruction": "You must add at least one node to your environment in order to deploy. See the ",
"locked_settings_alert": "在继续前请重新检查环境配置包括节点磁盘分区和网络配置在Fuel部署完该OpenStack环境后这些设置均无法更改",
"package_information": "Packages and updates are fetched from the repositories defined in the Settings tab. If your environment uses the default external repositories, verify that the Fuel Master node can access the Internet. If the Fuel Master node is not connected to the Internet, you must set up a local mirror and configure Fuel to upload packages from the local mirror. Fuel must have network access to the local mirror. You may also configure alternate repositories for installation. For more information, see ",
"and_vcenter": "和VCenter",
"neutron_with": "Neutron with",
"horizon": "Horizon",
"horizon_description": "The OpenStack dashboard Horizon现在可用",
@ -2180,12 +2171,7 @@
"compute": {
"title": "计算",
"qemu": "QEMU-KVM",
"vcenter": "vCenter",
"qemu_description": "如果要使用 QUME 虚拟化和相应的 KVM 加速,请选择此项。",
"vcenter_description": "如果要在 VMware vCenter 上运行 OpenStack请选择此项。",
"vcenter_warning": "vCenter 不能和 QUME-KVM 一起部署。",
"vcenter_requires_network_backend": "需要 DVS/NSX 插件来创建 vCenter 和 Neutron 网络环境",
"vcenter_plugins_page": "详细信息请访问 Fuel 插件页面",
"empty_choice": "请至少选择一种虚拟化类型"
},
"network": {
@ -2193,7 +2179,6 @@
"description": "请选择虚拟机内网的方案。一旦完成设置,你将不能更改这个选项。更多信息,请看",
"description_link": "Mirantis OpenStack 的网络拓扑计划指南",
"release_alert": "__NameAndRelease.release_name__ 不支持 Neutron。",
"hypervisor_alert": "你已经选择了 vCenter 作为虚拟化方案,不能再选择 Neutron",
"neutron_gre_description": "你的网络硬件必须支持 GRE。这个选项支持 65535 个网络。",
"neutron_vlan": "Neutron 并使用 VLAN默认",
"neutron_vlan_description": "你的网络硬件必须支持 VLAN。这个选项支持 4095 个网络。",
@ -2919,29 +2904,14 @@
"title": "コンピュート",
"kvm": "KVM",
"qemu": "QEMU",
"vcenter": "vCenter",
"kvm_description": "ハードウェア上でOpenStackを実行する場合、ハイパーバイザーはこのタイプを選択してください",
"qemu_description": "仮想ホスト上でOpenStackを実行する場合、ハイパーバイザーはこのタイプを選択してください",
"vcenter_description": "ESXiサーバとともにvCenter環境をハイパーバイザーとして使用する場合、このタイプを選択してください",
"vcenter_ip": "ホスト名",
"vcenter_ip_description": "vCenterのホスト名またはIPアドレス",
"vcenter_username": "ユーザー名",
"vcenter_username_description": "vCenterの管理者ユーザー名",
"vcenter_password": "パスワード",
"vcenter_password_description": "vCenterの管理者パスワード",
"vcenter_cluster": "クラスタ",
"vcenter_cluster_description": "vCenterのクラスタ名。複数のクラスタがある場合はカンマでクラスタ名を区切ってください。",
"vcenter_ip_warning": "ホスト名またはIPv4アドレスが不正です",
"vcenter_user_warning": "ユーザー名は空白にはできません",
"vcenter_password_warning": "パスワードは空白にはできません",
"vcenter_cluster_warning": "クラスターリストが不正です"
"qemu_description": "仮想ホスト上でOpenStackを実行する場合、ハイパーバイザーはこのタイプを選択してください"
},
"network": {
"title": "ネットワーク設定",
"description": "プライベート(ゲスト)ネットワーク構成を選択します。ここで選択したものはウィザード終了後に変更することはできません。詳細については次を参照してください",
"description_link": "Mirantis OpenStackプランニングガイド ネットワークトポロジー編",
"release_alert": "__NameAndRelease.release_name__ ではNeutronがサポートされません",
"hypervisor_alert": "VLANまたはGREセグメンテーションとNeutronはコンピュートオプションとして __Compute.vcenter__ では使用できません。",
"neutron_gre_description": "ネットワーク機器がGREセグメンテーションをサポートしている必要があります。このオプションは、65535までのネットワークをサポートします。",
"neutron_vlan_description": "ネットワーク機器がVLANセグメンテーション用に設定されている必要があります。このオプションは、4095までのネットワークをサポートします。"
},

View File

@ -28,7 +28,6 @@ import NetworkTab from 'views/cluster_page_tabs/network_tab';
import SettingsTab from 'views/cluster_page_tabs/settings_tab';
import LogsTab from 'views/cluster_page_tabs/logs_tab';
import HealthCheckTab from 'views/cluster_page_tabs/healthcheck_tab';
import {VmWareTab, VmWareModels} from 'plugins/vmware/vmware';
import {Link} from 'views/controls';
var ClusterPage = React.createClass({
@ -83,7 +82,6 @@ var ClusterPage = React.createClass({
{url: 'nodes', tab: NodesTab},
{url: 'network', tab: NetworkTab},
{url: 'settings', tab: SettingsTab},
{url: 'vmware', tab: VmWareTab},
{url: 'logs', tab: LogsTab},
{url: 'history', tab: HistoryTab},
{url: 'workflows', tab: WorkflowsTab},
@ -151,13 +149,6 @@ var ClusterPage = React.createClass({
cluster.get('release').fetch()
]);
})
.then(() => {
if (!cluster.get('settings').get('common.use_vcenter.value')) return true;
var vcenter = new VmWareModels.VCenter({id: id});
cluster.set({vcenter});
return vcenter.fetch();
})
.then(() => {
var deployedSettings = new models.Settings();
deployedSettings.url = baseUrl + '/attributes/deployed';

View File

@ -557,24 +557,6 @@ var ClusterActionsPanel = React.createClass({
</div>
]
},
// check VCenter settings
(cluster) => {
if (!cluster.get('settings').get('common.use_vcenter.value')) return false;
var vcenter = cluster.get('vcenter');
vcenter.setModels(_.extend({
current_vcenter: vcenter.get('availability_zones').at(0),
glance: vcenter.get('glance')
}, configModels));
return !vcenter.isValid() && {
blocker: [
<span key='vcenter'>{i18n('vmware.has_errors') + ' '}
<Link to={'/cluster/' + cluster.id + '/vmware'}>
{i18n('vmware.tab_name')}
</Link>
</span>
]
};
},
// check cluster settings
(cluster) => {
var settings = cluster.get('settings');
@ -1083,11 +1065,7 @@ var ClusterInfo = React.createClass({
return cluster.get('release').get('name');
case 'compute':
var libvirtSettings = settings.get('common').libvirt_type;
var computeLabel = _.find(libvirtSettings.values, {data: libvirtSettings.value}).label;
if (settings.get('common').use_vcenter.value) {
return computeLabel + ' ' + i18n(ns + 'and_vcenter');
}
return computeLabel;
return _.find(libvirtSettings.values, {data: libvirtSettings.value}).label;
case 'network':
var networkingParameters = cluster.get('networkConfiguration').get('networking_parameters');
return (i18n('common.network.neutron_' + networkingParameters.get('segmentation_type')));

View File

@ -334,7 +334,6 @@ var Compute = React.createClass({
this.processRestrictions(this.components, ['hypervisor']);
},
render() {
var vcenter = this.props.allComponents.get('hypervisor:vmware');
return (
<div className='wizard-compute-pane'>
<ComponentCheckboxGroup
@ -342,19 +341,6 @@ var Compute = React.createClass({
components={this.components}
onChange={this.props.onChange}
/>
{vcenter && vcenter.get('invalid') &&
<div className='alert alert-warning vcenter-locked'>
<div>
{i18n('dialog.create_cluster_wizard.compute.vcenter_requires_network_backend')}
</div>
<a
href='http://stackalytics.com/report/driverlog?project_id=openstack%2Ffuel'
target='_blank'
>
{i18n('dialog.create_cluster_wizard.compute.vcenter_plugins_page')}
</a>
</div>
}
{this.constructor.hasErrors(this.props.wizard) &&
<div className='alert alert-warning empty-choice'>
{i18n('dialog.create_cluster_wizard.compute.empty_choice')}