From 64993055e7367610793e4bf488e237a22268167f Mon Sep 17 00:00:00 2001 From: Michael Johnson Date: Thu, 23 Jun 2022 21:54:32 +0000 Subject: [PATCH] Fix designate-dashboard lint Previously the lint test was failing to run because there was no configuration file for it. This patch adds the .eslintrc file and fixes the found lint issues. This patch also adds tox environments to run the lint and karma tests. Change-Id: Idcef4c3ce4e9455acceed645c2530355989a7ee2 --- .eslintrc | 41 +++++ .../designatedashboard.module.js | 3 +- .../actions/actions.module.js | 7 +- .../actions/set.service.js | 60 +++---- .../actions/unset.service.js | 19 ++- .../os-designate-floatingip/api.service.js | 13 +- .../details/overview.controller.js | 8 +- .../os-designate-floatingip.module.js | 16 +- .../actions/common-forms.service.js | 136 +++++++-------- .../actions/create.service.js | 4 +- .../actions/delete.service.js | 8 +- .../actions/update.service.js | 8 +- .../os-designate-recordset/api.service.js | 17 +- .../details/details.module.js | 16 +- .../details/overview.controller.js | 2 +- .../details/zone-recordsets.controller.js | 6 +- .../os-designate-recordset.module.js | 65 +++---- .../actions/actions.module.spec.js | 2 +- .../actions/common-forms.service.js | 160 +++++++++--------- .../actions/create.service.js | 2 +- .../actions/delete.service.js | 6 +- .../actions/update.service.js | 10 +- .../os-designate-zone/api.service.js | 16 +- .../details/details.module.js | 2 +- .../details/overview.controller.js | 4 +- .../os-designate-zone.module.js | 12 +- .../resources/util.service.js | 25 ++- package.json | 4 +- tox.ini | 12 ++ 29 files changed, 371 insertions(+), 313 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..463133c --- /dev/null +++ b/.eslintrc @@ -0,0 +1,41 @@ +# Set up globals +globals: + angular: false + +extends: openstack + +# Most environment options are not explicitly enabled or disabled, only +# included here for completeness' sake. They are commented out, because the +# global updates.py script would otherwise override them during a global +# requirements synchronization. +# +# Individual projects should choose which platforms they deploy to. + +env: + # browser global variables. + browser: true + + # Adds all of the Jasmine testing global variables for version 1.3 and 2.0. + jasmine: true + +# Enable eslint-plugin-angular +plugins: + - angular + +# Below we adjust rules specific to horizon's usage of openstack's linting +# rules, and its own plugin inclusions. +rules: + ############################################################################# + # Disabled Rules from eslint-config-openstack + ############################################################################# + valid-jsdoc: 1 + brace-style: 1 + no-extra-parens: 1 + consistent-return: 1 + callback-return: 1 + guard-for-in: 1 + block-scoped-var: 1 + semi-spacing: 1 + no-redeclare: 1 + no-new: 1 + no-warning-comments: 0 diff --git a/designatedashboard/static/designatedashboard/designatedashboard.module.js b/designatedashboard/static/designatedashboard/designatedashboard.module.js index e51e60f..6728658 100644 --- a/designatedashboard/static/designatedashboard/designatedashboard.module.js +++ b/designatedashboard/static/designatedashboard/designatedashboard.module.js @@ -71,7 +71,8 @@ 'designatedashboard.basePath' ]; - function run(registry, basePath) { + function run() { +// function run(registry, basePath) { //registry.setDefaultSummaryTemplateUrl(basePath + 'table/default-drawer.html'); } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/actions.module.js b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/actions.module.js index 1efe950..cea160d 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/actions.module.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/actions.module.js @@ -37,12 +37,7 @@ 'designatedashboard.resources.os-designate-floatingip.actions.unset' ]; - function run( - registry, - resourceTypeString, - setAction, - unsetAction) - { + function run(registry, resourceTypeString, setAction, unsetAction) { var resourceType = registry.getResourceType(resourceTypeString); resourceType diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/set.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/set.service.js index c8b09fb..8ad48fe 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/set.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/set.service.js @@ -33,7 +33,7 @@ 'horizon.framework.widgets.modal-wait-spinner.service' ]; - /** + /* * @ngDoc factory * @name designatedashboard.resources.os-designate-floatingip.actions.set * @@ -51,44 +51,44 @@ var dnsServiceEnabled; var title = null; // Set once perform is called var formConfig = { - "schema": { - "type": "object", - "properties": { - "ptrdname": { - "type": "string", - "pattern": /^.+\.$/ + schema: { + type: "object", + properties: { + ptrdname: { + type: "string", + pattern: /^.+\.$/ }, - "description": { - "type": "string" - }, - "ttl": { - "type": "integer", - "minimum": 0, - "maximum": 2147483647 + description: { + type: "string" }, + ttl: { + type: "integer", + minimum: 0, + maximum: 2147483647 + } } }, - "form": [ + form: [ { - "key": "ptrdname", - "title": gettext("Domain Name"), - "description": gettext("Domain name ending in '.'"), - "validationMessage": gettext("Domain must end with '.'"), - "placeholder": "smtp.example.com.", - "type": "text", - "required": true + key: "ptrdname", + title: gettext("Domain Name"), + description: gettext("Domain name ending in '.'"), + validationMessage: gettext("Domain must end with '.'"), + placeholder: "smtp.example.com.", + type: "text", + required: true }, { - "key": "description", - "type": "textarea", - "title": gettext("Description"), - "description": gettext("Details about the PTR record.") + key: "description", + type: "textarea", + title: gettext("Description"), + description: gettext("Details about the PTR record.") }, { - "key": "ttl", - "title": gettext("TTL"), - "description": gettext("Time To Live in seconds."), - "type": "number" + key: "ttl", + title: gettext("TTL"), + description: gettext("Time To Live in seconds."), + type: "number" } ] }; diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/unset.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/unset.service.js index f66b958..49e82a6 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/unset.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/actions/unset.service.js @@ -34,7 +34,7 @@ 'horizon.framework.widgets.modal-wait-spinner.service' ]; - /** + /* * @ngDoc factory * @name designatedashboard.resources.os-designate-floatingip.actions.unset * @@ -50,20 +50,21 @@ schemaFormModalService, toast, waitSpinner) { - var dnsServiceEnabled; var title = null; // Set on perform - var currentFloatingIpId; // Used to remember the ID we are modifying since it isn't returned by the unset API call + // currentFloatingIpId is used to remember the ID we are modifying since + // it isn't returned by the unset API call + var dnsServiceEnabled, currentFloatingIpId; // Unset it just a simple case of "set", but with ptrdname of 'null' var formConfig = { - "schema": { - "type": "object", - "properties": { + schema: { + type: "object", + properties: { } }, - "form": [ + form: [ ], - "model": { + model: { } }; @@ -118,7 +119,7 @@ waitSpinner.hideModalSpinner(); } - function onSuccess(response) { + function onSuccess() { waitSpinner.hideModalSpinner(); toast.add('success', message.success); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/api.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/api.service.js index 1f766e2..77d9a2c 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/api.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/api.service.js @@ -26,7 +26,7 @@ 'horizon.framework.widgets.toast.service' ]; - /** + /* * @ngdoc service * @param {Object} httpService * @param {Object} toastService @@ -60,7 +60,7 @@ * @returns {Object} The result of the API call */ function list(params) { - var config = params ? {'params': params} : {}; + var config = params ? {params: params} : {}; return httpService.get(apiPassthroughUrl + 'v2/reverse/floatingips', config) .catch(function () { toastService.add('error', gettext('Unable to retrieve the floating ip PTRs.')); @@ -68,7 +68,7 @@ } function get(id, params) { - var config = params ? {'params': params} : {}; + var config = params ? {params: params} : {}; return httpService.get(apiPassthroughUrl + 'v2/reverse/floatingips/' + id, config) .catch(function () { toastService.add('error', gettext('Unable to get the floating ip PTR ' + id)); @@ -94,10 +94,11 @@ description: data.description, ttl: data.ttl }; - return httpService.patch(apiPassthroughUrl + 'v2/reverse/floatingips/' + floatingIpID, apiData) + return httpService.patch( + apiPassthroughUrl + 'v2/reverse/floatingips/' + floatingIpID, apiData) .catch(function () { toastService.add('error', gettext('Unable to set the floating IP PTR record.')); - }) + }); } /** @@ -115,7 +116,7 @@ ptrdname: null, description: null, ttl: null - }) + }); } } }()); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/details/overview.controller.js b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/details/overview.controller.js index 13446bd..0f8b81b 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/details/overview.controller.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/details/overview.controller.js @@ -1,6 +1,6 @@ /** * (c) Copyright 2016 Hewlett Packard Enterprise Development LP - * + * * 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 @@ -18,7 +18,9 @@ angular .module('designatedashboard.resources.os-designate-floatingip.details') - .controller('designatedashboard.resources.os-designate-floatingip.details.overviewController', controller); + .controller( + 'designatedashboard.resources.os-designate-floatingip.details.overviewController', + controller); controller.$inject = [ 'designatedashboard.resources.os-designate-floatingip.resourceType', @@ -33,7 +35,7 @@ ) { var ctrl = this; - ctrl.item; + ctrl.item = {}; ctrl.resourceType = registry.getResourceType(resourceTypeCode); $scope.context.loadPromise.then(onGetResponse); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/os-designate-floatingip.module.js b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/os-designate-floatingip.module.js index 82e4476..613fa63 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/os-designate-floatingip.module.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-floatingip/os-designate-floatingip.module.js @@ -40,7 +40,8 @@ config.$inject = [ '$provide', '$windowProvider' ]; function config($provide, $windowProvider) { - var path = $windowProvider.$get().STATIC_URL + 'designatedashboard/resources/os-designate-floatingip/'; + var path = $windowProvider.$get().STATIC_URL + + 'designatedashboard/resources/os-designate-floatingip/'; $provide.constant('designatedashboard.resources.os-designate-floatingip.basePath', path); } @@ -52,13 +53,7 @@ 'designatedashboard.resources.util' ]; - function run( - detailRoute, - registry, - api, - resourceTypeString, - util) - { + function run(detailRoute, registry, api, resourceTypeString, util) { var resourceType = registry.getResourceType(resourceTypeString); resourceType .setNames(gettext('Floating IP'), gettext('Floating IPs')) @@ -100,12 +95,13 @@ id: 'address', priority: 1, sortDefault: true, - template: '{$ item.address $}' + template: '{$ item.address $}' }) .append({ id: 'ptrdname', filters: ['noValue'], - priority: 1, + priority: 1 }) .append({ id: 'status', diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/common-forms.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/common-forms.service.js index 3f18bcc..2a2856a 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/common-forms.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/common-forms.service.js @@ -27,7 +27,7 @@ 'designatedashboard.resources.os-designate-recordset.typeMap' ]; - /** + /* * Service to return a schema form config for action forms. Especially useful for forms * like create and update that differ only in the readonly state of certain form fields. * @@ -43,7 +43,7 @@ ///////////////// - /** + /* * Returns the create form config * @returns {{schema, form, model}|*} */ @@ -51,7 +51,7 @@ return getCreateUpdateFormConfig(false); } - /** + /* * Return the update form config * @returns {{schema, form, model}|*} */ @@ -59,7 +59,7 @@ return getCreateUpdateFormConfig(true); } - /** + /* * Return the create/update form. The two forms are identical except for * during update, some fields are read-only. * @@ -68,96 +68,96 @@ */ function getCreateUpdateFormConfig(readonly) { return { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "pattern": /^.+\.$/ + schema: { + type: "object", + properties: { + name: { + type: "string", + pattern: /^.+\.$/ }, - "description": { - "type": "string" + description: { + type: "string" }, - "type": { - "type": "string", - "enum": editableTypes + type: { + type: "string", + enum: editableTypes }, - "ttl": { - "type": "integer", - "minimum": 1, - "maximum": 2147483647 + ttl: { + type: "integer", + minimum: 1, + maximum: 2147483647 }, - "records": { - "type": "array", - "items": { - "type": "object", - "properties": { - "record": { - "type": "string" + records: { + type: "array", + items: { + type: "object", + properties: { + record: { + type: "string" } } }, - "minItems": 1, - "uniqueItems": true + minItems: 1, + uniqueItems: true } } }, - "form": [ + form: [ { - "key": "type", - "readonly": readonly, - "title": gettext("Type"), - "description": gettext("Select the type of record set"), - "type": "select", - "titleMap": editableTypes.map(function toTitleMap(type) { + key: "type", + readonly: readonly, + title: gettext("Type"), + description: gettext("Select the type of record set"), + type: "select", + titleMap: editableTypes.map(function toTitleMap(type) { return { - "value": type, - "name": typeMap[type] - } + value: type, + name: typeMap[type] + }; }), - "required": true + required: true }, { - "key": "name", - "readonly": readonly, - "type": "text", - "title": gettext("Name"), - "description": gettext("DNS name for the record set, ending in '.'"), - "validationMessage": gettext("DNS name must end with '.'"), - "placeholder": "www.example.com.", - "required": true + key: "name", + readonly: readonly, + type: "text", + title: gettext("Name"), + description: gettext("DNS name for the record set, ending in '.'"), + validationMessage: gettext("DNS name must end with '.'"), + placeholder: "www.example.com.", + required: true }, { - "key": "description", - "type": "textarea", - "title": gettext("Description"), - "description": gettext("Details about the zone.") + key: "description", + type: "textarea", + title: gettext("Description"), + description: gettext("Details about the zone.") }, { - "key": "ttl", - "title": gettext("TTL"), - "description": gettext("Time To Live in seconds."), - "type": "number", - "required": true + key: "ttl", + title: gettext("TTL"), + description: gettext("Time To Live in seconds."), + type: "number", + required: true }, { - "key": "records", - "title": gettext("Records"), - "type": "array", - "description": gettext("Records for the record set."), - "add": gettext("Add Record"), - "items": [ + key: "records", + title: gettext("Records"), + type: "array", + description: gettext("Records for the record set."), + add: gettext("Add Record"), + items: [ { - "key": "records[].record", - "title": gettext("Record") + key: "records[].record", + title: gettext("Record") } ], - "required": true + required: true } ], - "model": { - "type": "A", - "ttl": 3600 + model: { + type: "A", + ttl: 3600 } }; } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/create.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/create.service.js index db9298a..7f9b066 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/create.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/create.service.js @@ -35,7 +35,7 @@ 'horizon.framework.widgets.modal-wait-spinner.service' ]; - /** + /* * @ngDoc factory * @name designatedashboard.resources.os-designate-recordset.actions.create * @@ -73,7 +73,7 @@ dnsServiceEnabled = serviceCatalog.ifTypeEnabled('dns'); } - function allowed(item) { + function allowed() { return $q.all([ createRecordSetPolicy, dnsServiceEnabled diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/delete.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/delete.service.js index 1c81f72..361f17c 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/delete.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/delete.service.js @@ -1,6 +1,6 @@ /** * (c) Copyright 2016 Hewlett Packard Enterprise Development LP - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use self file except in compliance with the License. You may obtain * a copy of the License at @@ -111,7 +111,7 @@ // Remember the record sets we are allowed to delete so that on delete modal submit // we can map the recordset ID back to the full recordset. Then we can fetch the // corresponding zone ID - allowedRecordsets = result.pass.map(getEntity) + allowedRecordsets = result.pass.map(getEntity); outcome = deleteModal.open(scope, allowedRecordsets, context).then(createResult); } return outcome; @@ -157,7 +157,7 @@ function editableRecordType(recordset) { return $qExtensions.booleanAsPromise( - !(recordset.type == 'NS' && recordset.name == recordset.zone_name) && // not apex NS + !(recordset.type === 'NS' && recordset.name === recordset.zone_name) && // not apex NS editableTypes.indexOf(recordset.type) > -1 ); } @@ -165,7 +165,7 @@ function deleteRecordSet(recordSetId) { var recordSet = allowedRecordsets.find(function(element) { return element.id === recordSetId; - }) + }); return recordsetApi.deleteRecordSet(recordSet.zone_id, recordSet.id); } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/update.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/update.service.js index 672f265..dcaade0 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/update.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/actions/update.service.js @@ -37,7 +37,7 @@ 'horizon.framework.widgets.modal-wait-spinner.service' ]; - /** + /* * @ngDoc factory * @name designatedashboard.resources.os-designate-recordset.actions.update * @@ -56,7 +56,7 @@ schemaFormModalService, toast, waitSpinner) { - var updateRecordSetPolicy, dnsServiceEnabled; + var updateRecordSetPolicy; var title = gettext("Update Record Set"); var message = { success: gettext('Record Set %s was successfully updated.') @@ -93,7 +93,7 @@ function editableRecordType(recordset) { return $qExtensions.booleanAsPromise( - !(recordset.type == 'NS' && recordset.name == recordset.zone_name) && // not apex NS + !(recordset.type === 'NS' && recordset.name === recordset.zone_name) && // not apex NS editableTypes.indexOf(recordset.type) > -1 ); } @@ -111,7 +111,7 @@ // Map the records objects to record objects if (item.hasOwnProperty("records")) { var records = item.records.map(function (item) { - return {"record": item} + return {record: item}; }); formConfig.model.records = records; } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/api.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/api.service.js index 7e3ada3..88da513 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/api.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/api.service.js @@ -27,7 +27,7 @@ 'horizon.framework.widgets.toast.service' ]; - /** + /* * @ngdoc service * @param {Object} httpService * @param {Object} toastService @@ -48,7 +48,7 @@ /////////////// - /** + /* * @name list * @description * Get a list of record sets. @@ -68,7 +68,7 @@ }); } - /** + /* * @name get * @description * Get a single record set by ID. @@ -86,14 +86,15 @@ // common when then delete action removes a record set. Mask this failure by // always returning a successful promise instead of terminating the $http promise // in the .error handler. - return httpService.get(apiPassthroughUrl + 'v2/zones/' + zoneId + '/recordsets/' + recordSetId + '/') + return httpService.get( + apiPassthroughUrl + 'v2/zones/' + zoneId + '/recordsets/' + recordSetId + '/') .then(undefined, function onError() { toastService.add('error', gettext('Unable to retrieve the record set.')); return $q.when({}); }); } - /** + /* * @name delete * @description * Delete a single record set by ID @@ -106,7 +107,8 @@ * @returns {*} */ function deleteRecordSet(zoneId, recordSetId) { - return httpService.delete(apiPassthroughUrl + 'v2/zones/' + zoneId + '/recordsets/' + recordSetId + '/') + return httpService.delete( + apiPassthroughUrl + 'v2/zones/' + zoneId + '/recordsets/' + recordSetId + '/') .catch(function () { toastService.add('error', gettext('Unable to delete the record set.')); }); @@ -127,7 +129,8 @@ description: data.description, records: data.records }; - return httpService.put(apiPassthroughUrl + 'v2/zones/' + zoneId + '/recordsets/' + recordSetId, apiData) + return httpService.put( + apiPassthroughUrl + 'v2/zones/' + zoneId + '/recordsets/' + recordSetId, apiData) .catch(function () { toastService.add('error', gettext('Unable to update the record set.')); }); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/details.module.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/details.module.js index 8c407b2..91a230d 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/details.module.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/details.module.js @@ -32,7 +32,7 @@ 'designatedashboard.resources.os-designate-recordset.resourceType', 'designatedashboard.resources.os-designate-recordset.api', 'designatedashboard.resources.os-designate-recordset.basePath', - 'horizon.framework.conf.resource-type-registry.service', + 'horizon.framework.conf.resource-type-registry.service' ]; function run( @@ -48,7 +48,7 @@ .setPathParser(pathParser) .setSummaryTemplateUrl(basePath + 'details/drawer.html'); - /** + /* * * @param identifier * The object returned by the pathParser containing the zone ID and record set ID to load @@ -57,11 +57,11 @@ return recordSetApi.get(identifier.zoneId, identifier.recordSetId); } - /** + /* * Because a record set is contained by a zone, we implement a custom * pathGenerator to encode the zone ID and record set ID for the generic * details panel. - * + * * @param item * A record set * @@ -71,7 +71,7 @@ return item.zone_id + '/' + item.id; } - /** + /* * Given a path, extract the zone and record set ids * * @param path @@ -86,14 +86,14 @@ return { zoneId: split[0], recordSetId: split[1] - } + }; } resourceType.detailsViews .prepend({ id: 'recordsetDetailsOverview', name: gettext('Overview'), - template: basePath + 'details/overview.html', + template: basePath + 'details/overview.html' }, 0); // Append a record set view to the zones resource view @@ -102,7 +102,7 @@ .append({ id: 'zoneRecordSets', name: gettext('Record Sets'), - template: basePath + 'details/zone-recordsets.html', + template: basePath + 'details/zone-recordsets.html' }); } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/overview.controller.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/overview.controller.js index 0340d2e..f47fcfa 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/overview.controller.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/overview.controller.js @@ -1,6 +1,6 @@ /** * (c) Copyright 2016 Hewlett Packard Enterprise Development LP - * + * * 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 diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/zone-recordsets.controller.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/zone-recordsets.controller.js index 44184d5..1c2b112 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/zone-recordsets.controller.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/details/zone-recordsets.controller.js @@ -1,6 +1,6 @@ /** * (c) Copyright 2016 Hewlett Packard Enterprise Development LP - * + * * 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 @@ -18,7 +18,9 @@ angular .module('designatedashboard.resources.os-designate-recordset') - .controller('designatedashboard.resources.os-designate-recordset.zoneRecordSetsController', controller); + .controller( + 'designatedashboard.resources.os-designate-recordset.zoneRecordSetsController', + controller); controller.$inject = [ '$scope', diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/os-designate-recordset.module.js b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/os-designate-recordset.module.js index da60c23..1eac589 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-recordset/os-designate-recordset.module.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-recordset/os-designate-recordset.module.js @@ -36,42 +36,43 @@ 'OS::Designate::RecordSet') .constant( 'designatedashboard.resources.os-designate-recordset.typeMap', - { - 'A': gettext('A - Address record'), - 'AAAA': gettext('AAAA - IPv6 address record'), - 'CNAME': gettext('CNAME - Canonical name record'), - 'MX': gettext('MX - Mail exchange record'), - 'PTR': gettext('PTR - Pointer record'), - 'SPF': gettext('SPF - Sender Policy Framework'), - 'SRV': gettext('SRV - Service locator'), - 'SSHFP': gettext('SSHFP - SSH Public Key Fingerprint'), - 'TXT': gettext('TXT - Text record'), - 'SOA': gettext('SOA - Start of authority record'), - 'NS': gettext('NS - Name server'), - 'CAA': gettext('CAA - Certificate Authority Authorization record'), - }) + { + A: gettext('A - Address record'), + AAAA: gettext('AAAA - IPv6 address record'), + CNAME: gettext('CNAME - Canonical name record'), + MX: gettext('MX - Mail exchange record'), + PTR: gettext('PTR - Pointer record'), + SPF: gettext('SPF - Sender Policy Framework'), + SRV: gettext('SRV - Service locator'), + SSHFP: gettext('SSHFP - SSH Public Key Fingerprint'), + TXT: gettext('TXT - Text record'), + SOA: gettext('SOA - Start of authority record'), + NS: gettext('NS - Name server'), + CAA: gettext('CAA - Certificate Authority Authorization record') + }) .constant( 'designatedashboard.resources.os-designate-recordset.editableTypes', - [ - "A", - "AAAA", - "CNAME", - "MX", - "NS", - "PTR", - "SPF", - "SRV", - "SSHFP", - "TXT", - "CAA", - ]) + [ + "A", + "AAAA", + "CNAME", + "MX", + "NS", + "PTR", + "SPF", + "SRV", + "SSHFP", + "TXT", + "CAA" + ]) .config(config) .run(run); config.$inject = ['$provide', '$windowProvider']; function config($provide, $windowProvider) { - var path = $windowProvider.$get().STATIC_URL + 'designatedashboard/resources/os-designate-recordset/'; + var path = $windowProvider.$get().STATIC_URL + + 'designatedashboard/resources/os-designate-recordset/'; $provide.constant('designatedashboard.resources.os-designate-recordset.basePath', path); } @@ -166,7 +167,9 @@ sortDefault: true, filters: ['noName'], // For link format, see pathGenerator in details.module.js - template: '{$ item.name $}' + template: '{$ item.name $}' }) .append({ id: 'type', @@ -198,7 +201,7 @@ return { label: typeMap[key], key: key - } + }; }) }) .append({ @@ -220,7 +223,7 @@ ] }); - /** + /* * list all recordsets within a zone. Requires "zoneId" in the params. All other * params will be passed unmodified as URL params to the API. * diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/actions.module.spec.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/actions.module.spec.js index f4bcda2..ba86e32 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/actions.module.spec.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/actions.module.spec.js @@ -46,4 +46,4 @@ }); -})(); \ No newline at end of file +})(); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/common-forms.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/common-forms.service.js index 55df08f..ab854a5 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/common-forms.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/common-forms.service.js @@ -41,7 +41,7 @@ ///////////////// - /** + /* * Returns the create zone form config * @returns {{schema, form, model}|*} */ @@ -49,7 +49,7 @@ return getCreateUpdateFormConfig(false); } - /** + /* * Return the update zone form config * @returns {{schema, form, model}|*} */ @@ -57,7 +57,7 @@ return getCreateUpdateFormConfig(true); } - /** + /* * Return the create/update zone form. The two forms are identical except for * during update, some fields are read-only. * @@ -66,118 +66,118 @@ */ function getCreateUpdateFormConfig(readonly) { return { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "pattern": /^.+\.$/ + schema: { + type: "object", + properties: { + name: { + type: "string", + pattern: /^.+\.$/ }, - "description": { - "type": "string" + description: { + type: "string" }, - "email": { - "type": "string", - "format": "email", - "pattern": /^[^@]+@[^@]+$/ + email: { + type: "string", + format: "email", + pattern: /^[^@]+@[^@]+$/ }, - "type": { - "type": "string", - "enum": [ + type: { + type: "string", + enum: [ "PRIMARY", "SECONDARY" ] }, - "ttl": { - "type": "integer", - "minimum": 1, - "maximum": 2147483647 + ttl: { + type: "integer", + minimum: 1, + maximum: 2147483647 }, - "masters": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" + masters: { + type: "array", + items: { + type: "object", + properties: { + address: { + type: "string" } } }, - "minItems": 1, - "uniqueItems": true + minItems: 1, + uniqueItems: true } } }, - "form": [ + form: [ { - "key": "name", - "readonly": readonly, - "title": gettext("Name"), - "description": gettext("Zone name ending in '.'"), - "validationMessage": gettext("Zone must end with '.'"), - "placeholder": "example.com.", - "type": "text", - "required": true + key: "name", + readonly: readonly, + title: gettext("Name"), + description: gettext("Zone name ending in '.'"), + validationMessage: gettext("Zone must end with '.'"), + placeholder: "example.com.", + type: "text", + required: true }, { - "key": "description", - "type": "textarea", - "title": gettext("Description"), - "description": gettext("Details about the zone.") + key: "description", + type: "textarea", + title: gettext("Description"), + description: gettext("Details about the zone.") }, { - "key": "email", - "title": gettext("Email Address"), - "description": gettext("Email address to contact the zone owner."), - "validationMessage": gettext("Email address must contain a single '@' character"), - "type": "text", - "condition": "model.type == 'PRIMARY'", - "required": true + key: "email", + title: gettext("Email Address"), + description: gettext("Email address to contact the zone owner."), + validationMessage: gettext("Email address must contain a single '@' character"), + type: "text", + condition: "model.type == 'PRIMARY'", + required: true }, { - "key": "ttl", - "title": gettext("TTL"), - "description": gettext("Time To Live in seconds."), - "type": "number", - "condition": "model.type == 'PRIMARY'", - "required": true + key: "ttl", + title: gettext("TTL"), + description: gettext("Time To Live in seconds."), + type: "number", + condition: "model.type == 'PRIMARY'", + required: true }, { - "key": "type", - "readonly": readonly, - "title": gettext("Type"), - "description": gettext("Select the type of zone"), - "type": "select", - "titleMap": [ + key: "type", + readonly: readonly, + title: gettext("Type"), + description: gettext("Select the type of zone"), + type: "select", + titleMap: [ { - "value": "PRIMARY", - "name": gettext("Primary") + value: "PRIMARY", + name: gettext("Primary") }, { - "value": "SECONDARY", - "name": gettext("Secondary") + value: "SECONDARY", + name: gettext("Secondary") } ] }, { - "key": "masters", - "readonly": readonly, - "title": gettext("Masters"), - "type": "array", - "description": gettext("DNS master(s) for the Secondary zone."), - "condition": "model.type == 'SECONDARY'", - "add": gettext("Add Master"), - "items": [ + key: "masters", + readonly: readonly, + title: gettext("Masters"), + type: "array", + description: gettext("DNS master(s) for the Secondary zone."), + condition: "model.type == 'SECONDARY'", + add: gettext("Add Master"), + items: [ { - "key": "masters[].address", - "title": gettext("IP Address") + key: "masters[].address", + title: gettext("IP Address") } ] } ], - "model": { - "type": "PRIMARY", - "ttl": 3600 + model: { + type: "PRIMARY", + ttl: 3600 } }; } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/create.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/create.service.js index f1d34ba..89cf740 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/create.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/create.service.js @@ -34,7 +34,7 @@ 'horizon.framework.widgets.modal-wait-spinner.service' ]; - /** + /* * @ngDoc factory * @name designatedashboard.resources.os-designate-zone.actions.create * diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/delete.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/delete.service.js index e0bd9c0..1a22bec 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/delete.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/delete.service.js @@ -1,6 +1,6 @@ /** * (c) Copyright 2016 Hewlett Packard Enterprise Development LP - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use self file except in compliance with the License. You may obtain * a copy of the License at @@ -70,8 +70,8 @@ ////////////// function initAction() { - context = { }; - deleteZonePromise = policy.ifAllowed({rules: [['dns', 'delete_zone']]}); + context = { }; + deleteZonePromise = policy.ifAllowed({rules: [['dns', 'delete_zone']]}); } function perform(items, scope) { diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/update.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/update.service.js index 0db3095..457baf9 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/update.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/actions/update.service.js @@ -35,7 +35,7 @@ 'horizon.framework.widgets.modal-wait-spinner.service' ]; - /** + /* * @ngDoc factory * @name designatedashboard.resources.os-designate-zone.actions.update * @@ -52,7 +52,7 @@ schemaFormModalService, toast, waitSpinner) { - var updateZonePolicy, dnsServiceEnabled; + var updateZonePolicy; var title = gettext("Update Zone"); var message = { success: gettext('Zone %s was successfully updated.') @@ -98,8 +98,8 @@ // Map the masters objects to address objects if (item.hasOwnProperty("masters")) { var masters = item.masters.map(function (item) { - return { "address": item } - }) + return { address: item }; + }); formConfig.masters = masters; } return schemaFormModalService.open(formConfig).then(onSubmit, onCancel); @@ -112,7 +112,7 @@ if (context.model.hasOwnProperty("masters")) { var masters = context.model.masters.map(function (item) { return item.address; - }) + }); zoneModel.masters = masters; } diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/api.service.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/api.service.js index 7e8ea5e..6a72513 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/api.service.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/api.service.js @@ -26,7 +26,7 @@ 'horizon.framework.widgets.toast.service' ]; - /** + /* * @ngdoc service * @param {Object} httpService * @param {Object} toastService @@ -46,7 +46,7 @@ return service; /////////////// - + /** * @name list * @description @@ -57,7 +57,7 @@ * * @param {Object} params * Query parameters. Optional. - * + * * @returns {Object} The result of the API call */ /* @@ -69,7 +69,7 @@ }); }*/ function list(params) { - var config = params ? {'params': params} : {}; + var config = params ? {params: params} : {}; return httpService.get(apiPassthroughUrl + 'v2/zones/', config) .catch(function () { toastService.add('error', gettext('Unable to retrieve the zone.')); @@ -93,7 +93,7 @@ }); } - /** + /* * @name deleteZone * @description * Delete a single zone by ID @@ -121,7 +121,7 @@ return httpService.post(apiPassthroughUrl + 'v2/zones/', data) .catch(function() { toastService.add('error', gettext('Unable to create the zone.')); - }) + }); } /** @@ -143,10 +143,10 @@ ttl: data.ttl, description: data.description }; - return httpService.patch(apiPassthroughUrl + 'v2/zones/' + id + '/', apiData ) + return httpService.patch(apiPassthroughUrl + 'v2/zones/' + id + '/', apiData) .catch(function() { toastService.add('error', gettext('Unable to update the zone.')); - }) + }); } } }()); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/details.module.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/details.module.js index 96a12b6..d60ddd1 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/details.module.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/details.module.js @@ -50,7 +50,7 @@ .prepend({ id: 'zoneDetailsOverview', name: gettext('Overview'), - template: basePath + 'details/overview.html', + template: basePath + 'details/overview.html' }, 0); function loadFunction(identifier) { diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/overview.controller.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/overview.controller.js index 58c5601..7944867 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/overview.controller.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/details/overview.controller.js @@ -1,6 +1,6 @@ /** * (c) Copyright 2016 Hewlett Packard Enterprise Development LP - * + * * 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 @@ -33,7 +33,7 @@ ) { var ctrl = this; - ctrl.item; + ctrl.item = {}; ctrl.resourceType = registry.getResourceType(resourceTypeCode); $scope.context.loadPromise.then(onGetResponse); diff --git a/designatedashboard/static/designatedashboard/resources/os-designate-zone/os-designate-zone.module.js b/designatedashboard/static/designatedashboard/resources/os-designate-zone/os-designate-zone.module.js index c5a20e6..617b8b7 100644 --- a/designatedashboard/static/designatedashboard/resources/os-designate-zone/os-designate-zone.module.js +++ b/designatedashboard/static/designatedashboard/resources/os-designate-zone/os-designate-zone.module.js @@ -40,7 +40,8 @@ config.$inject = ['$provide', '$windowProvider']; function config($provide, $windowProvider) { - var path = $windowProvider.$get().STATIC_URL + 'designatedashboard/resources/os-designate-zone/'; + var path = $windowProvider.$get().STATIC_URL + + 'designatedashboard/resources/os-designate-zone/'; $provide.constant('designatedashboard.resources.os-designate-zone.basePath', path); } @@ -136,7 +137,8 @@ id: 'name', priority: 1, sortDefault: true, - template: '{$ item.name $}' + template: '{$ item.name $}' }) .append({ id: 'type', @@ -185,9 +187,9 @@ function typeMap() { return { - 'primary': gettext('Primary'), - 'secondary': gettext('Secondary') - } + primary: gettext('Primary'), + secondary: gettext('Secondary') + }; } function listZones() { diff --git a/designatedashboard/static/designatedashboard/resources/util.service.js b/designatedashboard/static/designatedashboard/resources/util.service.js index cfaa787..fa7bc6d 100644 --- a/designatedashboard/static/designatedashboard/resources/util.service.js +++ b/designatedashboard/static/designatedashboard/resources/util.service.js @@ -21,10 +21,9 @@ .factory('designatedashboard.resources.util', utilService); utilService.$inject = [ - 'horizon.framework.util.q.extensions', + 'horizon.framework.util.q.extensions' ]; - function utilService($qExtensions) { var service = { notDeleted: notDeleted, @@ -47,9 +46,9 @@ return $qExtensions.booleanAsPromise(resource.status !== 'PENDING'); } - /** - * Build a model object based on the given item, using only the fields present in the form config 'key's. - * Only 'truthy' values are copied. + /* + * Build a model object based on the given item, using only the fields + * present in the form config 'key's. Only 'truthy' values are copied. * * @param form - an array of objects describing the form. Must have a 'key' attribute. * @param item - the data to copy into the model @@ -68,19 +67,19 @@ function actionMap() { return { - 'none': gettext('None'), - 'create': gettext('Create') - } + none: gettext('None'), + create: gettext('Create') + }; } function statusMap() { return { - 'active': gettext('Active'), - 'pending': gettext('Pending') - } + active: gettext('Active'), + pending: gettext('Pending') + }; } - /** + /* * hz-resource-table tracks by 'id' which doesn't change when an individual item is updated. * Create a synthetic '_timestampId' using the item id plus the specified timestamp field. * When this field is used as a track-by in hz-resource-table, items in the table to update @@ -97,7 +96,7 @@ var _idField = idField || 'id'; var timestamp = Date.now(); items.map(function annotateFloatingIp(item) { - if ( angular.isDefined(timestampField) ) { + if (angular.isDefined(timestampField)) { timestamp = item[timestampField]; } item._timestampId = item[_idField] + timestamp; diff --git a/package.json b/package.json index 577863f..a7e5c43 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ "repository": "none", "license": "Apache 2.0", "devDependencies": { - "eslint": "1.10.3", + "eslint": "^1.10.3", "eslint-config-openstack": "1.2.4", + "eslint-plugin-angular": "^1.0.1", "jasmine-core": "2.4.1", "karma": "~1.1.2", "karma-firefox-launcher": "2.1.0", @@ -23,4 +24,3 @@ }, "dependencies": {} } - diff --git a/tox.ini b/tox.ini index cb189b8..a46dde8 100644 --- a/tox.ini +++ b/tox.ini @@ -66,3 +66,15 @@ exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,rele [testenv:releasenotes] commands = sphinx-build -a -E -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html + +[testenv:eslint] +# npm must be installed on the system, for example +# sudo apt-get install npm +commands = npm install + npm run lint + +[testenv:karma] +# npm must be installed on the system, for example +# sudo apt-get install npm +commands = npm install + npm test