Align model with v2 api

To allow easier developement of features such as single create.

Change-Id: Ic77ca8ae938c06e5ebed25d60d8b42241bf46414
This commit is contained in:
Jacky Hu 2018-03-19 19:15:35 +08:00
parent 2f6e2a386c
commit f9fcb3d9e6
14 changed files with 468 additions and 508 deletions

View File

@ -126,10 +126,10 @@ def create_loadbalancer(request):
conn = _get_sdk_connection(request)
loadbalancer = conn.load_balancer.create_load_balancer(
project_id=request.user.project_id,
vip_subnet_id=data['loadbalancer']['subnet'],
vip_subnet_id=data['loadbalancer']['vip_subnet_id'],
name=data['loadbalancer'].get('name'),
description=data['loadbalancer'].get('description'),
vip_address=data['loadbalancer'].get('ip'),
vip_address=data['loadbalancer'].get('vip_address'),
admin_state_up=data['loadbalancer'].get('admin_state_up')
)
@ -162,7 +162,7 @@ def create_listener(request, **kwargs):
# https://bugs.launchpad.net/octavia/+bug/1714294
listener = conn.load_balancer.create_listener(
protocol=data['listener']['protocol'],
protocol_port=data['listener']['port'],
protocol_port=data['listener']['protocol_port'],
load_balancer_id=kwargs['loadbalancer_id'],
name=data['listener'].get('name'),
description=data['listener'].get('description'),
@ -227,23 +227,11 @@ def create_pool(request, **kwargs):
"""
data = request.DATA
session_persistence_type = data['pool'].get('type')
if session_persistence_type is None:
session_persistence = None
else:
cookie = data['pool'].get('cookie')
if session_persistence_type != 'APP_COOKIE':
cookie = None
session_persistence = {
'type': session_persistence_type,
'cookie_name': cookie
}
conn = _get_sdk_connection(request)
pool = conn.load_balancer.create_pool(
protocol=data['pool']['protocol'],
lb_algorithm=data['pool']['method'],
session_persistence=session_persistence,
lb_algorithm=data['pool']['lb_algorithm'],
session_persistence=data['pool'].get('session_persistence'),
listener_id=kwargs['listener_id'],
loadbalancer_id=kwargs['loadbalancer_id'],
name=data['pool'].get('name'),
@ -273,14 +261,14 @@ def create_health_monitor(request, **kwargs):
conn = _get_sdk_connection(request)
health_mon = conn.load_balancer.create_health_monitor(
type=data['monitor']['type'],
delay=data['monitor']['interval'],
delay=data['monitor']['delay'],
timeout=data['monitor']['timeout'],
max_retries=data['monitor']['retry'],
max_retries_down=data['monitor']['retry_down'],
max_retries=data['monitor']['max_retries'],
max_retries_down=data['monitor']['max_retries_down'],
pool_id=kwargs['pool_id'],
http_method=data['monitor'].get('method'),
url_path=data['monitor'].get('path'),
expected_codes=data['monitor'].get('status'),
http_method=data['monitor'].get('http_method'),
url_path=data['monitor'].get('url_path'),
expected_codes=data['monitor'].get('expected_codes'),
admin_state_up=data['monitor'].get('admin_state_up')
)
@ -311,8 +299,8 @@ def add_member(request, **kwargs):
member = conn.load_balancer.create_member(
pool_id,
address=member['address'],
protocol_port=member['port'],
subnet_id=member['subnet'],
protocol_port=member['protocol_port'],
subnet_id=member['subnet_id'],
weight=member.get('weight'),
monitor_address=monitor_address if monitor_address else None,
monitor_port=member.get('monitor_port'),
@ -467,23 +455,11 @@ def update_pool(request, **kwargs):
pool_id = data['pool'].get('id')
loadbalancer_id = data.get('loadbalancer_id')
session_persistence_type = data['pool'].get('type')
if session_persistence_type is None:
session_persistence = None
else:
cookie = data['pool'].get('cookie')
if session_persistence_type != 'APP_COOKIE':
cookie = None
session_persistence = {
'type': session_persistence_type,
'cookie_name': cookie
}
conn = _get_sdk_connection(request)
pool = conn.load_balancer.update_pool(
pool=pool_id,
lb_algorithm=data['pool']['method'],
session_persistence=session_persistence,
lb_algorithm=data['pool']['lb_algorithm'],
session_persistence=data['pool'].get('session_persistence'),
name=data['pool'].get('name'),
description=data['pool'].get('description'),
admin_state_up=data['pool'].get('admin_state_up')
@ -521,13 +497,13 @@ def update_monitor(request, **kwargs):
conn = _get_sdk_connection(request)
healthmonitor = conn.load_balancer.update_health_monitor(
monitor_id,
delay=data['monitor'].get('interval'),
delay=data['monitor'].get('delay'),
timeout=data['monitor'].get('timeout'),
max_retries=data['monitor'].get('retry'),
max_retries_down=data['monitor'].get('retry_down'),
http_method=data['monitor'].get('method'),
url_path=data['monitor'].get('path'),
expected_codes=data['monitor'].get('status'),
max_retries=data['monitor'].get('max_retries'),
max_retries_down=data['monitor'].get('max_retries_down'),
http_method=data['monitor'].get('http_method'),
url_path=data['monitor'].get('url_path'),
expected_codes=data['monitor'].get('expected_codes'),
admin_state_up=data['monitor'].get('admin_state_up')
)

View File

@ -163,11 +163,11 @@
},
monitor_address: {
label: gettext('Monitor Address'),
filters: ['noName']
filters: ['noValue']
},
monitor_port: {
label: gettext('Monitor Port'),
filters: ['noName']
filters: ['noValue']
}
};
}

View File

@ -60,7 +60,7 @@
while (listenerPortExists(defaultPort)) {
defaultPort += 1;
}
$scope.model.spec.listener.port = defaultPort;
$scope.model.spec.listener.protocol_port = defaultPort;
var members = $scope.model.members.concat($scope.model.spec.members);
members.forEach(function setMemberPort(member) {

View File

@ -32,7 +32,7 @@
};
listener = {
protocol: null,
port: 80
protocol_port: 80
};
scope = {
model: {
@ -55,17 +55,17 @@
it('should update port on protocol change to HTTP', function() {
ctrl.protocolChange('HTTP');
expect(listener.port).toBe(81);
expect(listener.protocol_port).toBe(81);
});
it('should update port on protocol change to TERMINATED_HTTPS', function() {
ctrl.protocolChange('TERMINATED_HTTPS');
expect(listener.port).toBe(443);
expect(listener.protocol_port).toBe(443);
});
it('should update port on protocol change to TCP', function() {
ctrl.protocolChange('TCP');
expect(listener.port).toBeUndefined();
expect(listener.protocol_port).toBeUndefined();
});
it('should update member ports on protocol change to TERMINATED_HTTPS', function() {

View File

@ -47,7 +47,7 @@
<span class="hz-icon-required fa fa-asterisk"></span>
</label>
<input name="port" id="port" type="number" class="form-control"
ng-model="model.spec.listener.port" ng-pattern="/^\d+$/" min="1" max="65535"
ng-model="model.spec.listener.protocol_port" ng-pattern="/^\d+$/" min="1" max="65535"
ng-required="true" ng-disabled="model.context.id"
validate-unique="model.listenerPorts">
<span class="help-block" ng-show="(listenerDetailsForm.port.$error.number || listenerDetailsForm.port.$error.required) && listenerDetailsForm.port.$dirty">

View File

@ -28,7 +28,7 @@
ng-class="{ 'has-error': loadBalancerDetailsForm.ip.$invalid && loadBalancerDetailsForm.ip.$dirty }">
<label translate class="control-label" for="ip">IP address</label>
<input name="ip" id="ip" type="text" class="form-control"
ng-model="model.spec.loadbalancer.ip" ng-pattern="::ctrl.ipPattern"
ng-model="model.spec.loadbalancer.vip_address" ng-pattern="::ctrl.ipPattern"
ng-disabled="model.context.id">
<span class="help-block" ng-show="loadBalancerDetailsForm.ip.$invalid && loadBalancerDetailsForm.ip.$dirty">
{$ ::ctrl.ipError $}
@ -44,7 +44,7 @@
</label>
<select class="form-control" name="subnet" id="subnet"
ng-options="subnet.name || subnet.id for subnet in model.subnets"
ng-model="model.spec.loadbalancer.subnet" ng-required="true"
ng-model="model.spec.loadbalancer.vip_subnet_id" ng-required="true"
ng-disabled="model.context.id">
</select>
</div>

View File

@ -118,8 +118,8 @@
$scope.model.spec.members.push({
id: memberCounter++,
address: null,
subnet: null,
port: { HTTP: 80 }[protocol],
subnet_id: null,
protocol_port: { HTTP: 80 }[protocol],
weight: 1,
monitor_address: null,
monitor_port: null,

View File

@ -34,7 +34,7 @@
name: 'foo',
description: 'bar',
weight: 1,
port: 80,
protocol_port: 80,
address: { ip: '1.2.3.4', subnet: '1' },
addresses: [{ ip: '1.2.3.4', subnet: '1' },
{ ip: '2.3.4.5', subnet: '2' }]
@ -94,7 +94,7 @@
expect(model.spec.members.length).toBe(1);
expect(model.spec.members[0].id).toBe(0);
expect(model.spec.members[0].address).toBeNull();
expect(model.spec.members[0].subnet).toBeNull();
expect(model.spec.members[0].subnet_id).toBeNull();
});
it('should allocate a given member', function() {
@ -102,8 +102,8 @@
expect(model.spec.members.length).toBe(1);
expect(model.spec.members[0].id).toBe(0);
expect(model.spec.members[0].address).toEqual(model.members[0].address);
expect(model.spec.members[0].subnet).toBeUndefined();
expect(model.spec.members[0].port).toEqual(model.members[0].port);
expect(model.spec.members[0].subnet_id).toBeUndefined();
expect(model.spec.members[0].protocol_port).toEqual(model.members[0].protocol_port);
});
it('should deallocate a given member', function() {

View File

@ -68,7 +68,7 @@
<div ng-if="!row.addresses" class="form-group required">
<select name="{$ ::row.id $}-subnet" class="form-control"
ng-options="subnet.name for subnet in model.subnets"
ng-model="row.subnet" ng-required="true"
ng-model="row.subnet_id" ng-required="true"
ng-disabled="row.allocatedMember">
</select>
</div>
@ -78,7 +78,7 @@
<div class="form-group required member-port"
ng-class="{ 'has-error': memberDetailsForm['{$ ::row.id $}-port'].$invalid && memberDetailsForm['{$ ::row.id $}-port'].$dirty }">
<input name="{$ ::row.id $}-port" type="number" class="form-control"
ng-model="row.port" ng-pattern="/^\d+$/" min="1" max="65535"
ng-model="row.protocol_port" ng-pattern="/^\d+$/" min="1" max="65535"
ng-required="true" ng-disabled="row.allocatedMember"
popover-placement="top" popover-append-to-body="true"
popover-trigger="focus"

View File

@ -57,8 +57,7 @@
novaAPI,
lbaasv2API,
barbicanAPI,
serviceCatalog,
gettext
serviceCatalog
) {
var ports, keymanagerPromise;
@ -82,7 +81,6 @@
spec: null,
visibleResources: [],
subnets: [],
members: [],
listenerProtocols: ['HTTP', 'TCP', 'TERMINATED_HTTPS', 'HTTPS'],
@ -132,7 +130,6 @@
submit: null
};
model.visibleResources = [];
model.certificates = [];
model.listenerPorts = [];
@ -142,23 +139,24 @@
loadbalancer: {
name: null,
description: null,
ip: null,
subnet: null,
vip_address: null,
vip_subnet_id: null,
admin_state_up: true
},
listener: {
id: null,
name: gettext('Listener 1'),
name: null,
description: null,
protocol: null,
port: null,
protocol_port: null,
connection_limit: -1,
admin_state_up: true,
default_pool: null,
default_pool_id: null
},
l7policy: {
id: null,
name: gettext('L7 Policy 1'),
name: null,
description: null,
action: null,
position: null,
@ -177,24 +175,27 @@
},
pool: {
id: null,
name: gettext('Pool 1'),
name: null,
description: null,
protocol: null,
method: null,
type: null,
cookie: null,
lb_algorithm: null,
session_persistence: {
type: null,
cookie_name: null
},
admin_state_up: true
},
monitor: {
id: null,
name: null,
type: null,
interval: 5,
retry: 3,
retry_down: 3,
delay: 5,
max_retries: 3,
max_retries_down: 3,
timeout: 5,
method: 'GET',
status: '200',
path: '/',
http_method: 'GET',
expected_codes: '200',
url_path: '/',
admin_state_up: true
},
members: [],
@ -249,7 +250,6 @@
function initCreateLoadBalancer(keymanagerPromise) {
model.context.submit = createLoadBalancer;
return $q.all([
lbaasv2API.getLoadBalancers().then(onGetLoadBalancers),
neutronAPI.getSubnets().then(onGetSubnets),
neutronAPI.getPorts().then(onGetPorts),
novaAPI.getServers().then(onGetServers),
@ -436,22 +436,22 @@
function cleanFinalSpecLoadBalancer(finalSpec) {
var context = model.context;
// Load balancer requires subnet
if (!finalSpec.loadbalancer.subnet) {
// Load balancer requires vip_subnet_id
if (!finalSpec.loadbalancer.vip_subnet_id) {
delete finalSpec.loadbalancer;
} else {
finalSpec.loadbalancer.subnet = finalSpec.loadbalancer.subnet.id;
finalSpec.loadbalancer.vip_subnet_id = finalSpec.loadbalancer.vip_subnet_id.id;
}
// Cannot edit the IP or subnet
if (context.resource === 'loadbalancer' && context.id) {
delete finalSpec.subnet;
delete finalSpec.ip;
delete finalSpec.vip_subnet_id;
delete finalSpec.vip_address;
}
}
function cleanFinalSpecListener(finalSpec) {
if (!finalSpec.listener.protocol || !finalSpec.listener.port) {
if (!finalSpec.listener.protocol || !finalSpec.listener.protocol_port) {
// Listener requires protocol and port
delete finalSpec.listener;
delete finalSpec.certificates;
@ -470,13 +470,20 @@
function cleanFinalSpecPool(finalSpec) {
// Pool requires method
if (!finalSpec.pool.method) {
if (!finalSpec.pool.lb_algorithm) {
delete finalSpec.pool;
} else {
// The pool protocol must be HTTP if the listener protocol is TERMINATED_HTTPS and
// otherwise has to match it.
var protocol = finalSpec.listener ? finalSpec.listener.protocol : finalSpec.pool.protocol;
finalSpec.pool.protocol = protocol === 'TERMINATED_HTTPS' ? 'HTTP' : protocol;
if (angular.isObject(finalSpec.pool.session_persistence)) {
if (!finalSpec.pool.session_persistence.type) {
finalSpec.pool.session_persistence = null;
} else if (finalSpec.pool.session_persistence.type !== 'APP_COOKIE') {
finalSpec.pool.session_persistence.cookie_name = null;
}
}
}
}
@ -488,7 +495,7 @@
var members = [];
angular.forEach(finalSpec.members, function cleanMember(member) {
if (member.address && member.port) {
if (member.address && member.protocol_port) {
var propsToRemove = ['name', 'description', 'addresses', 'allocatedMember'];
propsToRemove.forEach(function deleteProperty(prop) {
if (angular.isDefined(member[prop])) {
@ -496,12 +503,12 @@
}
});
if (angular.isObject(member.address)) {
member.subnet = member.address.subnet;
member.subnet_id = member.address.subnet;
member.address = member.address.ip;
} else if (member.subnet) {
member.subnet = member.subnet.id;
} else if (member.subnet_id) {
member.subnet_id = member.subnet_id.id;
} else {
delete member.subnet;
delete member.subnet_id;
}
members.push(member);
}
@ -515,9 +522,9 @@
function cleanFinalSpecMonitor(finalSpec) {
// Monitor requires an interval, retry count, and timeout
if (!angular.isNumber(finalSpec.monitor.interval) ||
!angular.isNumber(finalSpec.monitor.retry) ||
// Monitor requires delay, max_retries, and timeout
if (!angular.isNumber(finalSpec.monitor.delay) ||
!angular.isNumber(finalSpec.monitor.max_retries) ||
!angular.isNumber(finalSpec.monitor.timeout)) {
delete finalSpec.monitor;
return;
@ -525,9 +532,9 @@
// Only include necessary monitor properties
if (finalSpec.monitor.type !== 'HTTP') {
delete finalSpec.monitor.method;
delete finalSpec.monitor.status;
delete finalSpec.monitor.path;
delete finalSpec.monitor.http_method;
delete finalSpec.monitor.expected_codes;
delete finalSpec.monitor.url_path;
}
}
@ -541,33 +548,10 @@
});
}
function onGetLoadBalancers(response) {
var existingNames = {};
angular.forEach(response.data.items, function nameExists(lb) {
existingNames[lb.name] = 1;
});
var name;
var index = response.data.items.length;
do {
index += 1;
name = interpolate(gettext('Load Balancer %(index)s'), { index: index }, true);
} while (name in existingNames);
model.spec.loadbalancer.name = name;
}
function onGetListeners(response) {
var existingNames = {};
angular.forEach(response.data.items, function nameExists(listener) {
existingNames[listener.name] = 1;
angular.forEach(response.data.items, function addPort(listener) {
model.listenerPorts.push(listener.protocol_port);
});
var name;
var index = response.data.items.length;
do {
index += 1;
name = interpolate(gettext('Listener %(index)s'), { index: index }, true);
} while (name in existingNames);
model.spec.listener.name = name;
}
function onGetPools(response) {
@ -634,7 +618,7 @@
member.address = member.addresses[0];
if (model.spec.pool.protocol) {
member.port = {HTTP: 80}[model.spec.pool.protocol];
member.protocol_port = {HTTP: 80}[model.spec.pool.protocol];
}
});
}
@ -675,7 +659,6 @@
setListenerSpec(result.listener || result);
if (result.listener) {
model.visibleResources.push('listener');
model.spec.loadbalancer_id = result.listener.load_balancers[0].id;
if (result.listener.protocol === 'TERMINATED_HTTPS') {
@ -688,15 +671,12 @@
});
});
});
model.visibleResources.push('certificates');
$('#wizard-side-nav ul li:last').show();
}
}
if (result.pool) {
setPoolSpec(result.pool);
model.visibleResources.push('pool');
model.visibleResources.push('members');
if (result.members) {
setMembersSpec(result.members);
@ -704,7 +684,6 @@
if (result.monitor) {
setMonitorSpec(result.monitor);
model.visibleResources.push('monitor');
}
}
}
@ -727,16 +706,12 @@
setPoolSpec(result.pool || result);
if (result.pool) {
model.visibleResources.push('pool');
model.visibleResources.push('members');
if (result.members) {
setMembersSpec(result.members);
}
if (result.monitor) {
setMonitorSpec(result.monitor);
model.visibleResources.push('monitor');
}
}
}
@ -745,8 +720,8 @@
var spec = model.spec.loadbalancer;
spec.name = loadbalancer.name;
spec.description = loadbalancer.description;
spec.ip = loadbalancer.vip_address;
spec.subnet = loadbalancer.vip_subnet_id;
spec.vip_address = loadbalancer.vip_address;
spec.vip_subnet_id = loadbalancer.vip_subnet_id;
spec.admin_state_up = loadbalancer.admin_state_up;
}
@ -756,7 +731,7 @@
spec.name = listener.name;
spec.description = listener.description;
spec.protocol = listener.protocol;
spec.port = listener.protocol_port;
spec.protocol_port = listener.protocol_port;
spec.connection_limit = listener.connection_limit;
spec.admin_state_up = listener.admin_state_up;
spec.default_pool_id = listener.default_pool_id;
@ -791,18 +766,9 @@
spec.name = pool.name;
spec.description = pool.description;
spec.protocol = pool.protocol;
spec.method = pool.lb_algorithm;
spec.lb_algorithm = pool.lb_algorithm;
spec.admin_state_up = pool.admin_state_up;
if (angular.isObject(pool.session_persistence)) {
var type = pool.session_persistence.type;
var cookie = pool.session_persistence.cookie_name;
if (type) {
spec.type = type;
}
if (type === 'APP_COOKIE' && cookie) {
spec.cookie = cookie;
}
}
spec.session_persistence = pool.session_persistence;
}
function setMembersSpec(membersList) {
@ -813,8 +779,8 @@
members.push({
id: member.id,
address: member.address,
subnet: mapSubnetObj(member.subnet_id),
port: member.protocol_port,
subnet_id: mapSubnetObj(member.subnet_id),
protocol_port: member.protocol_port,
weight: member.weight,
monitor_address: member.monitor_address,
monitor_port: member.monitor_port,
@ -829,13 +795,13 @@
var spec = model.spec.monitor;
spec.id = monitor.id;
spec.type = monitor.type;
spec.interval = monitor.delay;
spec.delay = monitor.delay;
spec.timeout = monitor.timeout;
spec.retry = monitor.max_retries;
spec.retry_down = monitor.max_retries_down;
spec.method = monitor.http_method;
spec.status = monitor.expected_codes;
spec.path = monitor.url_path;
spec.max_retries = monitor.max_retries;
spec.max_retries_down = monitor.max_retries_down;
spec.http_method = monitor.http_method;
spec.expected_codes = monitor.expected_codes;
spec.url_path = monitor.url_path;
spec.admin_state_up = monitor.admin_state_up;
}
@ -884,9 +850,9 @@
function initSubnet() {
var subnet = model.subnets.filter(function filterSubnetsByLoadBalancer(s) {
return s.id === model.spec.loadbalancer.subnet;
return s.id === model.spec.loadbalancer.vip_subnet_id;
})[0];
model.spec.loadbalancer.subnet = subnet;
model.spec.loadbalancer.vip_subnet_id = subnet;
}
function mapSubnetObj(subnetId) {

View File

@ -5,20 +5,20 @@
monitor.
</p>
<p>
<strong translate>Interval:</strong>
<strong translate>Delay:</strong>
<translate>
The interval between health checks. Must be greater than or equal to the timeout.
</translate>
</p>
<p>
<strong translate>Retries:</strong>
<strong translate>Max Retries:</strong>
<translate>
The number of allowed connection failures before marking the member as inactive. Must be a
number from 1 to 10.
</translate>
</p>
<p>
<strong translate>Retries down:</strong>
<strong translate>Max Retries Down:</strong>
<translate>
The number of allowed connection failures before marking the member as error. Must be a
number from 1 to 10. The default is 3.
@ -32,20 +32,20 @@
</translate>
</p>
<p>
<strong translate>HTTP method:</strong>
<strong translate>HTTP Method:</strong>
<translate>
The HTTP method used to perform the health check.
</translate>
</p>
<p>
<strong translate>Expected status codes:</strong>
<strong translate>Expected Codes:</strong>
<translate>
The expected HTTP status codes to get from a successful health check. Must be a single number,
a comma separated list of numbers, or a range (two numbers separated by a hyphen).
</translate>
</p>
<p>
<strong translate>URL path:</strong>
<strong translate>URL Path:</strong>
<translate>
The target of the health check HTTP request to the member. Must be a valid URL path.
</translate>

View File

@ -6,7 +6,7 @@
<div class="col-xs-12 col-sm-8 col-md-6 col-lg-4">
<div class="form-group required">
<label class="control-label" for="type">
<translate>Monitor type</translate>
<translate>Type</translate>
<span class="hz-icon-required fa fa-asterisk"></span>
</label>
<select class="form-control" name="type" id="type"
@ -21,11 +21,11 @@
<div class="form-group required"
ng-class="{ 'has-error': monitorDetailsForm.retry_down.$invalid && monitorDetailsForm.retry_down.$dirty }">
<label class="control-label" for="retry_down">
<translate>Retries down</translate>
<translate>Max Retries Down</translate>
<span class="hz-icon-required fa fa-asterisk"></span>
</label>
<input name="retry_down" id="retry_down" type="number" class="form-control"
ng-model="model.spec.monitor.retry_down" ng-pattern="/^\d+$/" min="1" max="10"
ng-model="model.spec.monitor.max_retries_down" ng-pattern="/^\d+$/" min="1" max="10"
ng-required="true">
<span class="help-block" ng-show="monitorDetailsForm.retry_down.$invalid && monitorDetailsForm.retry_down.$dirty">
{$ ::ctrl.retryDownError $}
@ -41,11 +41,11 @@
<div class="form-group required"
ng-class="{ 'has-error': monitorDetailsForm.interval.$invalid && monitorDetailsForm.interval.$dirty }">
<label class="control-label" for="interval">
<translate>Interval (sec)</translate>
<translate>Delay (sec)</translate>
<span class="hz-icon-required fa fa-asterisk"></span>
</label>
<input name="interval" id="interval" type="number" class="form-control"
ng-model="model.spec.monitor.interval" ng-pattern="/^\d+$/"
ng-model="model.spec.monitor.delay" ng-pattern="/^\d+$/"
ng-min="model.spec.monitor.timeout" ng-required="true">
<span class="help-block" ng-show="monitorDetailsForm.interval.$invalid && monitorDetailsForm.interval.$dirty">
{$ ::ctrl.intervalError $}
@ -57,11 +57,11 @@
<div class="form-group required"
ng-class="{ 'has-error': monitorDetailsForm.retry.$invalid && monitorDetailsForm.retry.$dirty }">
<label class="control-label" for="retry">
<translate>Retries</translate>
<translate>Max Retries</translate>
<span class="hz-icon-required fa fa-asterisk"></span>
</label>
<input name="retry" id="retry" type="number" class="form-control"
ng-model="model.spec.monitor.retry" ng-pattern="/^\d+$/" min="1" max="10"
ng-model="model.spec.monitor.max_retries" ng-pattern="/^\d+$/" min="1" max="10"
ng-required="true">
<span class="help-block" ng-show="monitorDetailsForm.retry.$invalid && monitorDetailsForm.retry.$dirty">
{$ ::ctrl.retryError $}
@ -91,10 +91,10 @@
<div class="col-xs-12 col-sm-8 col-md-6 col-lg-4">
<div class="form-group">
<label translate class="control-label" for="method">HTTP method</label>
<label translate class="control-label" for="method">HTTP Method</label>
<select class="form-control" name="method" id="method"
ng-options="method for method in model.monitorMethods"
ng-model="model.spec.monitor.method">
ng-model="model.spec.monitor.http_method">
</select>
</div>
</div>
@ -102,9 +102,9 @@
<div class="col-xs-12 col-sm-8 col-md-6 col-lg-4">
<div class="form-group"
ng-class="{ 'has-error': monitorDetailsForm.status.$invalid && monitorDetailsForm.status.$dirty }">
<label translate class="control-label" for="status">Expected status codes</label>
<label translate class="control-label" for="status">Expected Codes</label>
<input name="status" id="status" type="text" class="form-control"
ng-model="model.spec.monitor.status" ng-pattern="::ctrl.statusPattern">
ng-model="model.spec.monitor.expected_codes" ng-pattern="::ctrl.statusPattern">
<span class="help-block" ng-show="monitorDetailsForm.status.$invalid && monitorDetailsForm.status.$dirty">
{$ ::ctrl.statusError $}
</span>
@ -114,9 +114,9 @@
<div class="col-xs-12 col-sm-8 col-md-6 col-lg-4">
<div class="form-group"
ng-class="{ 'has-error': monitorDetailsForm.path.$invalid && monitorDetailsForm.path.$dirty }">
<label translate class="control-label" for="path">URL path</label>
<label translate class="control-label" for="path">URL Path</label>
<input name="path" id="path" type="text" class="form-control"
ng-model="model.spec.monitor.path" ng-pattern="::ctrl.urlPathPattern">
ng-model="model.spec.monitor.url_path" ng-pattern="::ctrl.urlPathPattern">
<span class="help-block" ng-show="monitorDetailsForm.path.$invalid && monitorDetailsForm.path.$dirty">
{$ ::ctrl.pathError $}
</span>

View File

@ -31,7 +31,7 @@
</label>
<select class="form-control" name="method" id="method"
ng-options="method for method in model.methods"
ng-model="model.spec.pool.method"
ng-model="model.spec.pool.lb_algorithm"
ng-required="true">
</select>
</div>
@ -64,17 +64,17 @@
</label>
<select class="form-control" name="type" id="type"
ng-options="type for type in model.types"
ng-model="model.spec.pool.type">
ng-model="model.spec.pool.session_persistence.type">
<option value="">None</option>
</select>
</div>
</div>
<div class="col-xs-12 col-sm-8 col-md-6" ng-if="model.spec.pool.type === 'APP_COOKIE'">
<div class="col-xs-12 col-sm-8 col-md-6" ng-if="model.spec.pool.session_persistence.type === 'APP_COOKIE'">
<div class="form-group">
<label translate class="control-label" for="cookie">Cookie</label>
<input name="cookie" id="cookie" type="text" class="form-control"
ng-model="model.spec.pool.cookie">
<label translate class="control-label" for="cookie_name">Cookie Name</label>
<input name="cookie_name" id="cookie_name" type="text" class="form-control"
ng-model="model.spec.pool.session_persistence.cookie_name">
</div>
</div>