Directive to check if Cinder Extensions are enabled

This creates a new directive that allows for the
HTML to check if a particular cinder extension is enabled.

Change-Id: I823cf721270fa25b321a9abca1d3e002fcd5c3e1
Partially-Implements: blueprint cinder-extensions.service
This commit is contained in:
Rajat Vig 2015-10-09 08:44:34 -07:00
parent d639b8cfab
commit 3808e8bad5
2 changed files with 160 additions and 0 deletions

View File

@ -0,0 +1,74 @@
/*
* 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.
*/
(function () {
'use strict';
angular
.module('horizon.app.core.cloud-services')
.directive('hzIfCinderExtensions', hzCinderExtensions);
hzCinderExtensions.$inject = [
'hzPromiseToggleTemplateDirective',
'horizon.app.core.openstack-service-api.cinderExtensions'
];
/**
* @ngdoc directive
* @name hz.api:directive:hzIfCinderExtensions
* @module hz.api
* @description
*
* Add this directive to any element containing content which should
* only be evaluated when the specified cinder extensions are enabled by
* the cinder servers in the currently selected region. If the cinder extensions
* are enabled, the content will be evaluated. Otherwise, the content will
* not be compiled. In addition, the element and everything contained by
* it will be removed completely, leaving a simple HTML comment.
*
* This is evaluated once per page load. In current horizon, this means
* it will get re-evaluated with events like the user opening another panel,
* changing logins, or changing their region.
*
* The hz-if-cinder-extensions attribute may be set to a single extension (String)
* or an array of extensions (each one being a String).
* All of the following are examples:
*
* hz-if-cinder-extensions='"SchedulerHints"'
* hz-if-cinder-extensions='["SchedulerHints"]'
* hz-if-cinder-extensions='["SchedulerHints", "DiskConfig"]'
*
* @example
*
* In the below, if the SchedulerHints cinder extension is not enabled, then
* the div element with hz-if-cinder-extensions and all of the elements inside
* of it will be removed and never evaluated by the angular compiler.
*
```html
<div hz-if-cinder-extensions='"SchedulerHints"'>
<!-- ui code here -->
</div>
```
*/
function hzCinderExtensions(hzPromiseToggleTemplateDirective, cinderExtensions) {
return angular.extend(
hzPromiseToggleTemplateDirective[0],
{
singlePromiseResolver: cinderExtensions.ifNameEnabled,
name: 'hzIfCinderExtensions'
}
);
}
})();

View File

@ -0,0 +1,86 @@
/*
* 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.
*/
(function () {
'use strict';
describe('horizon.app.core.cloud-services.hzCinderExtension', function () {
var $compile, $scope, deferred, cinderExtensionsAPI;
var template = [
'<div>',
'<div hz-if-cinder-extensions=\'\"ext_name\"\'>',
'<div class="child-element">',
'</div>',
'</div>',
'</div>'
].join('');
beforeEach(function() {
cinderExtensionsAPI = {
ifNameEnabled: function() {
return deferred.promise;
}
};
spyOn(cinderExtensionsAPI, 'ifNameEnabled').and.callThrough();
module('horizon.app.core.cloud-services');
module('horizon.framework.util.promise-toggle');
module('horizon.app.core.openstack-service-api', function($provide) {
$provide.value(
'horizon.app.core.openstack-service-api.cinderExtensions', cinderExtensionsAPI
);
});
inject(function (_$compile_, _$q_, _$rootScope_) {
$compile = _$compile_;
deferred = _$q_.defer();
$scope = _$rootScope_.$new();
});
});
// Please note, this code is primarily intended to verify that the
// directive specifies the correct name and that it uses the settings
// service API. Testing of the variations on inputs being resolved
// are tested in the hz-promise-toggle spec.
it('should evaluate child elements when extension is enabled', function () {
var element = $compile(template)($scope);
deferred.resolve();
expect(element.children().length).toBe(0);
expect(cinderExtensionsAPI.ifNameEnabled).toHaveBeenCalledWith('ext_name');
$scope.$apply();
expect(element.children().length).toBe(1);
});
it('should not evaluate child elements when extension is NOT enabled', function () {
var element = $compile(template)($scope);
deferred.reject();
expect(element.children().length).toBe(0);
expect(cinderExtensionsAPI.ifNameEnabled).toHaveBeenCalledWith('ext_name');
$scope.$apply();
expect(element.children().length).toBe(0);
});
});
})();