blob: 1dbcd7fd0c1cde7bba803ac8cac6dd4e4b186ecd [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,
Sean Condon058804c2019-04-16 09:41:52 +010020 EventEmitter, OnChanges, SimpleChanges
Sean Condonaa4366d2018-11-02 14:29:01 +000021} from '@angular/core';
Sean Condonf4f54a12018-10-10 23:25:46 +010022import { animate, state, style, transition, trigger } from '@angular/animations';
23import {
24 LogService,
Sean Condonf4f54a12018-10-10 23:25:46 +010025 FnService,
Sean Condonaa4366d2018-11-02 14:29:01 +000026 PanelBaseImpl,
27 IconService,
Sean Condon91481822019-01-01 13:56:14 +000028 SvgUtilService, LionService
Sean Condon3dd062f2020-04-14 09:25:00 +010029} from 'org_onosproject_onos/web/gui2-fw-lib/public_api';
Sean Condonf4f54a12018-10-10 23:25:46 +010030
Sean Condonaa4366d2018-11-02 14:29:01 +000031/**
32 * A model of instance information that drives each panel
33 */
34export interface Instance {
35 id: string;
36 ip: string;
37 online: boolean;
38 ready: boolean;
39 switches: number;
40 uiAttached: boolean;
41}
42
43/**
44 * ONOS GUI -- Topology Instances Panel.
45 * Displays ONOS instances. The onosInstances Array gets updated by topology.service
46 * whenever a topo2AllInstances update arrives back on the WebSocket
47 *
48 * This emits a mastership event when the user clicks on an instance, to
49 * see the devices that it has mastership of.
Sean Condonf4f54a12018-10-10 23:25:46 +010050 */
51@Component({
52 selector: 'onos-instance',
53 templateUrl: './instance.component.html',
54 styleUrls: [
55 './instance.component.css', './instance.theme.css',
56 '../../topology.common.css',
Sean Condon98b6ddb2019-12-24 08:07:40 +000057 '../../../../gui2-fw-lib/lib/widget/panel.css',
58 '../../../../gui2-fw-lib/lib/widget/panel-theme.css'
Sean Condonf4f54a12018-10-10 23:25:46 +010059 ],
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 Condon058804c2019-04-16 09:41:52 +010075export class InstanceComponent extends PanelBaseImpl implements OnChanges {
76 @Input() onosInstances: Instance[] = [];
Sean Condonaa4366d2018-11-02 14:29:01 +000077 @Input() divTopPx: number = 100;
Sean Condonb2c483c2019-01-16 20:28:55 +000078 @Input() on: boolean = false; // Override the parent class attribute
Sean Condonaa4366d2018-11-02 14:29:01 +000079 @Output() mastershipEvent = new EventEmitter<string>();
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,
Sean Condonaa4366d2018-11-02 14:29:01 +000086 protected is: IconService,
Sean Condon91481822019-01-01 13:56:14 +000087 protected sus: SvgUtilService,
88 private lion: LionService
Sean Condonf4f54a12018-10-10 23:25:46 +010089 ) {
Sean Condon95fb5742019-04-02 12:16:55 +010090 super(fs, log);
Sean Condon91481822019-01-01 13:56:14 +000091
92 if (this.lion.ubercache.length === 0) {
93 this.lionFn = this.dummyLion;
94 this.lion.loadCbs.set('topo-inst', () => this.doLion());
95 } else {
96 this.doLion();
97 }
Sean Condonf4f54a12018-10-10 23:25:46 +010098 this.log.debug('InstanceComponent constructed');
99 }
100
Sean Condon058804c2019-04-16 09:41:52 +0100101 ngOnChanges(changes: SimpleChanges): void {
102 if (changes['onosInstances']) {
103 this.onosInstances = <Instance[]>changes['onosInstances'].currentValue;
104 }
105 }
106
Sean Condonaa4366d2018-11-02 14:29:01 +0000107 /**
108 * Get a colour for the banner of the nth panel
109 * @param idx The index of the panel (0-6)
110 */
111 panelColour(idx: number): string {
112 return this.sus.cat7().getColor(idx, false, '');
Sean Condonf4f54a12018-10-10 23:25:46 +0100113 }
114
Sean Condonaa4366d2018-11-02 14:29:01 +0000115 /**
116 * Toggle the display of mastership
117 * If the same instance is clicked a second time then cancel display of mastership
118 * @param instId The instance to display mastership for
119 */
120 chooseMastership(instId: string): void {
121 if (this.mastership === instId) {
Sean Condon058804c2019-04-16 09:41:52 +0100122 this.mastership = undefined;
Sean Condonaa4366d2018-11-02 14:29:01 +0000123 } else {
124 this.mastership = instId;
125 }
126 this.mastershipEvent.emit(this.mastership);
127 this.log.debug('Instance', this.mastership, 'chosen on GUI');
128 }
Sean Condon91481822019-01-01 13:56:14 +0000129
130 /**
131 * Read the LION bundle for Details panel and set up the lionFn
132 */
133 doLion() {
134 this.lionFn = this.lion.bundle('core.view.Topo');
135
136 }
Sean Condonf4f54a12018-10-10 23:25:46 +0100137}