diff --git a/src/apps.js b/src/apps.js index f5f8c8bec..3eb444b63 100644 --- a/src/apps.js +++ b/src/apps.js @@ -154,6 +154,7 @@ AppsError.BAD_FIELD = 'Bad Field'; AppsError.BAD_STATE = 'Bad State'; AppsError.PORT_RESERVED = 'Port Reserved'; AppsError.PORT_CONFLICT = 'Port Conflict'; +AppsError.LOCATION_CONFLICT = 'Location Conflict'; AppsError.PLAN_LIMIT = 'Plan Limit'; AppsError.BAD_CERTIFICATE = 'Invalid certificate'; @@ -202,7 +203,6 @@ function validatePortBindings(portBindings, manifest) { if (!Number.isInteger(hostPort)) return new AppsError(AppsError.BAD_FIELD, `${hostPort} is not an integer`); if (RESERVED_PORTS.indexOf(hostPort) !== -1) return new AppsError(AppsError.PORT_RESERVED, `Port ${hostPort} is reserved.`); if (hostPort <= 1023 || hostPort > 65535) return new AppsError(AppsError.BAD_FIELD, `${hostPort} is not in permitted range`); - } // it is OK if there is no 1-1 mapping between values in manifest.tcpPorts and portBindings. missing values implies @@ -368,19 +368,20 @@ function getDuplicateErrorDetails(errorMessage, location, domainObject, portBind // check if the location or alternateDomains conflicts if (match[2] === 'subdomain') { // mysql reports a unique conflict with a dash: eg. domain:example.com subdomain:test => test-example.com - if (match[1] === `${location}-${domainObject.domain}`) return new AppsError(AppsError.ALREADY_EXISTS, `Domain '${domains.fqdn(location, domainObject)}' is in use`); + if (match[1] === `${location}-${domainObject.domain}`) { + return new AppsError(AppsError.LOCATION_CONFLICT, `Domain '${domains.fqdn(location, domainObject)}' is in use`, { location: location, domain: domainObject.domain }); + } - // check alternateDomains - let tmp = alternateDomains.filter(function (d) { - return match[1] === `${d.subdomain}-${d.domain}`; - }); + for (let d of alternateDomains) { + if (match[1] !== `${d.subdomain}-${d.domain}`) continue; - if (tmp.length > 0) return new AppsError(AppsError.ALREADY_EXISTS, `Alternate domain '${tmp[0].subdomain}.${tmp[0].domain}' is in use`); + return new AppsError(AppsError.LOCATION_CONFLICT, `Alternate domain '${d.subdomain}.${d.domain}' is in use`, { location: d.subdomain, domain: d.domain }); + } } // check if any of the port bindings conflict for (let portName in portBindings) { - if (portBindings[portName] === parseInt(match[1])) return new AppsError(AppsError.PORT_CONFLICT, `Port ${match[1]} is reserved`); + if (portBindings[portName] === parseInt(match[1])) return new AppsError(AppsError.PORT_CONFLICT, `Port ${match[1]} is reserved`, { portName }); } return new AppsError(AppsError.ALREADY_EXISTS, `${match[2]} '${match[1]}' is in use`);