Fix nodes registration

* Don't include uuid in nodes registration
* Add IPMI port to driver fields

Closes-Bug: 1689507
Closes-Bug: 1688543
Change-Id: I35df26175aa3fe44970420d8e1f0936fc1005337
(cherry picked from commit 2b74192998)
This commit is contained in:
Jiri Tomasek 2017-05-05 14:31:13 +02:00
parent 7372bbfb86
commit e873eb178c
6 changed files with 93 additions and 37 deletions

View File

@ -0,0 +1,6 @@
fixes:
- |
Fixes `bug 1689507 <https://launchpad.net/bugs/1689507>`__
IPMI port is now possible to specify when registering Nodes.
Fixes `bug 1688543 <https://launchpad.net/bugs/1688543>`__
Node UUID is not generated by UI when registering nodes any more.

View File

@ -9,6 +9,10 @@ const messages = defineMessages({
ipOrFqdnValidatorMessage: {
id: 'DriverFields.ipOrFqdnValidatorMessage',
defaultMessage: 'Please enter a valid IPv4 Address or a valid FQDN.'
},
portValidationMessage: {
id: 'DriverFields.portValidationMessage',
defaultMessage: 'Please enter valid Port number (0 - 65535)'
}
});
@ -16,38 +20,60 @@ class DriverFields extends React.Component {
constructor(props) {
super(props);
let ip_regex = '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]' +
'[0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
let ip_regex =
'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]' +
'[0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
let fqdn_regex = '^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$';
this.ipOrFqdnValidator = {matchRegexp: new RegExp(ip_regex + '|' + fqdn_regex)};
this.portRegex =
'^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}' + '|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$$';
this.ipOrFqdnValidator = {
matchRegexp: new RegExp(ip_regex + '|' + fqdn_regex)
};
this.ipOrFqdnValidatorMessage = this.props.intl.formatMessage(
messages.ipOrFqdnValidatorMessage);
messages.ipOrFqdnValidatorMessage
);
}
render() {
return (
<div>
<HorizontalInput name="pm_addr"
title={this.props.addr_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_addr}
validations={this.ipOrFqdnValidator}
validationError={this.ipOrFqdnValidatorMessage}
required />
<HorizontalInput name="pm_user"
title={this.props.user_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_user}
required />
<HorizontalTextarea name="pm_password"
title={this.props.pwd_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_password}
required />
<HorizontalInput
name="pm_addr"
title={this.props.addr_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_addr}
validations={this.ipOrFqdnValidator}
validationError={this.ipOrFqdnValidatorMessage}
required
/>
<HorizontalInput
name="pm_port"
title={this.props.port_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_port}
validations={{ matchRegexp: new RegExp(this.portRegex) }}
validationError={this.props.intl.formatMessage(messages.portValidationMessage)}
/>
<HorizontalInput
name="pm_user"
title={this.props.user_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_user}
required
/>
<HorizontalTextarea
name="pm_password"
title={this.props.pwd_title}
inputColumnClasses="col-sm-7"
labelColumnClasses="col-sm-5"
value={this.props.node.pm_password}
required
/>
</div>
);
}
@ -56,6 +82,7 @@ DriverFields.propTypes = {
addr_title: React.PropTypes.string.isRequired,
intl: React.PropTypes.object,
node: ImmutablePropTypes.record.isRequired,
port_title: React.PropTypes.string.isRequired,
pwd_title: React.PropTypes.string.isRequired,
user_title: React.PropTypes.string.isRequired
};

View File

@ -8,6 +8,10 @@ const messages = defineMessages({
id: 'PXEAndDRACDriverFields.addr_title',
defaultMessage: 'DRAC Host'
},
port_title: {
id: 'PXEAndDRACDriverFields.port_title',
defaultMessage: 'DRAC Port'
},
user_title: {
id: 'PXEAndDRACDriverFields.user_title',
defaultMessage: 'DRAC Username'
@ -21,10 +25,13 @@ const messages = defineMessages({
class PXEAndDRACDriverFields extends React.Component {
render() {
return (
<DriverFields {...this.props}
addr_title={this.props.intl.formatMessage(messages.addr_title)}
user_title={this.props.intl.formatMessage(messages.user_title)}
pwd_title={this.props.intl.formatMessage(messages.pwd_title)} />
<DriverFields
{...this.props}
addr_title={this.props.intl.formatMessage(messages.addr_title)}
user_title={this.props.intl.formatMessage(messages.user_title)}
port_title={this.props.intl.formatMessage(messages.port_title)}
pwd_title={this.props.intl.formatMessage(messages.pwd_title)}
/>
);
}
}

View File

@ -8,6 +8,10 @@ const messages = defineMessages({
id: 'PXEAndIPMIToolDriverFields.addr_title',
defaultMessage: 'IPMI IP Address or FQDN'
},
port_title: {
id: 'PXEAndIPMIToolDriverFields.port_title',
defaultMessage: 'IPMI Port'
},
user_title: {
id: 'PXEAndIPMIToolDriverFields.user_title',
defaultMessage: 'IPMI Username'
@ -21,10 +25,13 @@ const messages = defineMessages({
class PXEAndIPMIToolDriverFields extends React.Component {
render() {
return (
<DriverFields {...this.props}
addr_title={this.props.intl.formatMessage(messages.addr_title)}
user_title={this.props.intl.formatMessage(messages.user_title)}
pwd_title={this.props.intl.formatMessage(messages.pwd_title)} />
<DriverFields
{...this.props}
addr_title={this.props.intl.formatMessage(messages.addr_title)}
user_title={this.props.intl.formatMessage(messages.user_title)}
port_title={this.props.intl.formatMessage(messages.port_title)}
pwd_title={this.props.intl.formatMessage(messages.pwd_title)}
/>
);
}
}

View File

@ -8,6 +8,10 @@ const messages = defineMessages({
id: 'PXEAndSSHDriverFields.addr_title',
defaultMessage: 'SSH IP Address or FQDN'
},
port_title: {
id: 'PXEAndSSHDriverFields.port_title',
defaultMessage: 'SSH Port'
},
user_title: {
id: 'PXEAndSSHDriverFields.user_title',
defaultMessage: 'SSH User'
@ -21,10 +25,13 @@ const messages = defineMessages({
class PXEAndSSHDriverFields extends React.Component {
render() {
return (
<DriverFields {...this.props}
addr_title={this.props.intl.formatMessage(messages.addr_title)}
user_title={this.props.intl.formatMessage(messages.user_title)}
pwd_title={this.props.intl.formatMessage(messages.pwd_title)} />
<DriverFields
{...this.props}
addr_title={this.props.intl.formatMessage(messages.addr_title)}
user_title={this.props.intl.formatMessage(messages.user_title)}
port_title={this.props.intl.formatMessage(messages.port_title)}
pwd_title={this.props.intl.formatMessage(messages.pwd_title)}
/>
);
}
}

View File

@ -8,6 +8,7 @@ export const NodeToRegister = Record({
pm_user: undefined,
pm_addr: undefined,
pm_password: undefined,
pm_port: undefined,
arch: undefined,
cpu: undefined,
memory: undefined,
@ -16,13 +17,14 @@ export const NodeToRegister = Record({
});
export const IronicNode = Record({
uuid: undefined,
// uuid: undefined, TODO(jtomasek): re-add this once registration supports passing uuid
name: undefined,
mac: List(),
pm_type: 'pxe_ssh',
pm_user: undefined,
pm_addr: undefined,
pm_password: undefined,
pm_port: undefined,
arch: undefined,
cpu: undefined,
memory: undefined,