blob: f48da3412de3e84e8a17e650c041ba8507835e04 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* 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.
*/
import {IXosModelDiscovererService} from '../../datasources/helpers/model-discoverer.service';
import {IXosOnboarder} from '../../extender/services/onboard.service';
import {IXosAuthService} from '../../datasources/rest/auth.rest';
import './loader.scss';
class LoaderCtrl {
static $inject = [
'$log',
'$rootScope',
'$location',
'$timeout',
'$interval',
'$state',
'AuthService',
'XosConfig',
'XosModelDiscoverer',
`XosOnboarder`
];
public loader: boolean = true;
public message: string = 'Loading data...';
public error: string;
private getMessageInterval: ng.IPromise<any>;
constructor (
private $log: ng.ILogService,
private $rootScope: ng.IScope,
private $location: ng.ILocationService,
private $timeout: ng.ITimeoutService,
private $interval: ng.IIntervalService,
private $state: ng.ui.IStateService,
private XosAuthService: IXosAuthService,
private XosConfig: any,
private XosModelDiscoverer: IXosModelDiscovererService,
private XosOnboarder: IXosOnboarder
) {
this.getMessage();
this.run();
}
public run() {
if (this.XosModelDiscoverer.areModelsLoaded()) {
this.$log.debug(`[XosLoader] Models are already loaded, moving to: ${this.XosConfig.lastVisitedUrl}`);
this.moveOnTo(this.XosConfig.lastVisitedUrl);
}
else if (!this.XosAuthService.isAuthenticated()) {
this.$log.debug(`[XosLoader] Not authenticated, send to login`);
this.$state.go('xos.login');
}
else {
// NOTE loading XOS Models
this.XosModelDiscoverer.discover()
.then((res) => {
this.$log.info('[XosLoader] res: ' + res, res, typeof res);
if (res === 'chameleon') {
this.loader = false;
this.error = 'chameleon';
return 'chameleon';
}
else if (res) {
this.$log.info('[XosLoader] All models loaded');
// NOTE loading GUI Extensions
this.XosOnboarder.onboard();
return true;
}
else {
this.$log.info('[XosLoader] Failed to load some models, moving on.');
return true;
}
})
.then((res) => {
if (res === true) {
this.moveOnTo(this.XosConfig.lastVisitedUrl);
}
// NOTE otherwise stay here since we're printing some error messages
})
.catch(() => {
// XosModelDiscoverer.discover reject only in case of authentication error
this.XosAuthService.clearUser();
this.moveOnTo('/login');
})
.finally(() => {
// NOTE it is in a timeout as the searchService is loaded after that
this.$timeout(() => {
this.$rootScope.$emit('xos.core.modelSetup');
}, 500);
});
}
}
public moveOnTo(url: string) {
this.$log.info(`[XosLoader] Redirecting to: ${url}`);
switch (url) {
case '':
case '/':
case '/loader':
case '/login':
this.$location.path('/dashboard');
break;
default:
this.$timeout(() => {
this.$location.path(url);
}, 500);
break;
}
}
/**
* This method query the model-discoverer service to have the status of the loading
*/
public getMessage() {
this.getMessageInterval = this.$interval(() => {
this.message = this.XosModelDiscoverer.getStatusMessage();
}, 1000);
this.message = this.XosModelDiscoverer.getStatusMessage();
}
$onDestroy() {
this.$interval.cancel(this.getMessageInterval);
}
}
export const xosLoader: angular.IComponentOptions = {
template: `
<div class="loader-container">
<div ng-show="vm.loader" class="loader"></div>
</div>
<div class="row" ng-show="!vm.error">
<div class="col-sm-6 col-sm-offset-3">
<div class="alert alert-accent">
{{ vm.message }}
</div>
</div>
</div>
<div class="row" ng-show="vm.error == 'chameleon'">
<div class="col-sm-6 col-sm-offset-3">
<div class="alert alert-danger">
<div class="row">
<div class="col-xs-2">
<i class="fa fa-exclamation-triangle"></i>
</div>
<div class="col-xs-10">
<strong>Cannot load models definition.</strong><br>
Please check that the Chameleon container is running
</div>
</div>
</div>
</div>
</div>
`,
controllerAs: 'vm',
controller: LoaderCtrl
};