blob: 487550dc87ab86852ed6d51127e6a13a1ce7414b [file] [log] [blame]
Sean Condonf4f54a12018-10-10 23:25:46 +01001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Sean Condonaa4366d2018-11-02 14:29:01 +000016import {
17 Component,
18 Input,
19 Output,
20 EventEmitter
21} from '@angular/core';
Sean Condonf4f54a12018-10-10 23:25:46 +010022import { animate, state, style, transition, trigger } from '@angular/animations';
23import {
24 LogService,
25 LoadingService,
26 FnService,
Sean Condonaa4366d2018-11-02 14:29:01 +000027 PanelBaseImpl,
28 IconService,
Sean Condon91481822019-01-01 13:56:14 +000029 SvgUtilService, LionService
Sean Condonf4f54a12018-10-10 23:25:46 +010030} from 'gui2-fw-lib';
31
Sean Condonaa4366d2018-11-02 14:29:01 +000032/**
33 * A model of instance information that drives each panel
34 */
35export interface Instance {
36 id: string;
37 ip: string;
38 online: boolean;
39 ready: boolean;
40 switches: number;
41 uiAttached: boolean;
42}
43
44/**
45 * ONOS GUI -- Topology Instances Panel.
46 * Displays ONOS instances. The onosInstances Array gets updated by topology.service
47 * whenever a topo2AllInstances update arrives back on the WebSocket
48 *
49 * This emits a mastership event when the user clicks on an instance, to
50 * see the devices that it has mastership of.
Sean Condonf4f54a12018-10-10 23:25:46 +010051 */
52@Component({
53 selector: 'onos-instance',
54 templateUrl: './instance.component.html',
55 styleUrls: [
56 './instance.component.css', './instance.theme.css',
57 '../../topology.common.css',
58 '../../../../fw/widget/panel.css', '../../../../fw/widget/panel-theme.css'
59 ],
60 animations: [
61 trigger('instancePanelState', [
62 state('true', style({
63 transform: 'translateX(0%)',
Sean Condonaa4366d2018-11-02 14:29:01 +000064 opacity: '1.0'
Sean Condonf4f54a12018-10-10 23:25:46 +010065 })),
66 state('false', style({
67 transform: 'translateX(-100%)',
Sean Condonaa4366d2018-11-02 14:29:01 +000068 opacity: '0.0'
Sean Condonf4f54a12018-10-10 23:25:46 +010069 })),
70 transition('0 => 1', animate('100ms ease-in')),
71 transition('1 => 0', animate('100ms ease-out'))
72 ])
73 ]
74})
Sean Condonaa4366d2018-11-02 14:29:01 +000075export class InstanceComponent extends PanelBaseImpl {
76 @Input() divTopPx: number = 100;
Sean Condonb2c483c2019-01-16 20:28:55 +000077 @Input() on: boolean = false; // Override the parent class attribute
Sean Condonaa4366d2018-11-02 14:29:01 +000078 @Output() mastershipEvent = new EventEmitter<string>();
79 public onosInstances: Array<Instance>;
Sean Condonff85fbe2019-03-16 14:28:46 +000080 public mastership: string;
Sean Condon91481822019-01-01 13:56:14 +000081 lionFn; // Function
Sean Condonf4f54a12018-10-10 23:25:46 +010082
83 constructor(
84 protected fs: FnService,
85 protected log: LogService,
86 protected ls: LoadingService,
Sean Condonaa4366d2018-11-02 14:29:01 +000087 protected is: IconService,
Sean Condon91481822019-01-01 13:56:14 +000088 protected sus: SvgUtilService,
89 private lion: LionService
Sean Condonf4f54a12018-10-10 23:25:46 +010090 ) {
91 super(fs, ls, log);
Sean Condonaa4366d2018-11-02 14:29:01 +000092 this.onosInstances = <Array<Instance>>[];
Sean Condon91481822019-01-01 13:56:14 +000093
94 if (this.lion.ubercache.length === 0) {
95 this.lionFn = this.dummyLion;
96 this.lion.loadCbs.set('topo-inst', () => this.doLion());
97 } else {
98 this.doLion();
99 }
Sean Condonf4f54a12018-10-10 23:25:46 +0100100 this.log.debug('InstanceComponent constructed');
101 }
102
Sean Condonaa4366d2018-11-02 14:29:01 +0000103 /**
104 * Get a colour for the banner of the nth panel
105 * @param idx The index of the panel (0-6)
106 */
107 panelColour(idx: number): string {
108 return this.sus.cat7().getColor(idx, false, '');
Sean Condonf4f54a12018-10-10 23:25:46 +0100109 }
110
Sean Condonaa4366d2018-11-02 14:29:01 +0000111 /**
112 * Toggle the display of mastership
113 * If the same instance is clicked a second time then cancel display of mastership
114 * @param instId The instance to display mastership for
115 */
116 chooseMastership(instId: string): void {
117 if (this.mastership === instId) {
118 this.mastership = '';
119 } else {
120 this.mastership = instId;
121 }
122 this.mastershipEvent.emit(this.mastership);
123 this.log.debug('Instance', this.mastership, 'chosen on GUI');
124 }
Sean Condon91481822019-01-01 13:56:14 +0000125
126 /**
127 * Read the LION bundle for Details panel and set up the lionFn
128 */
129 doLion() {
130 this.lionFn = this.lion.bundle('core.view.Topo');
131
132 }
Sean Condonf4f54a12018-10-10 23:25:46 +0100133}