blob: 6a47ce3e77b42eeaba7f7e4b052f74fec5ff28aa [file] [log] [blame]
/*
* Copyright 2018-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 * as d3 from 'd3';
import {LocationType} from '../../backgroundsvg/backgroundsvg.component';
import {LayerType, Location, NodeType, RegionProps} from './regions';
import {LocMeta, MetaUi, ZoomUtils} from 'gui2-fw-lib/public_api';
export interface UiElement {
index?: number;
id: string;
}
export namespace LabelToggle {
/**
* Toggle state for how device labels should be displayed
*/
export enum Enum {
NONE,
ID,
NAME
}
/**
* Add the method 'next()' to the LabelToggle enum above
*/
export function next(current: Enum) {
if (current === Enum.NONE) {
return Enum.ID;
} else if (current === Enum.ID) {
return Enum.NAME;
} else if (current === Enum.NAME) {
return Enum.NONE;
}
}
}
export namespace HostLabelToggle {
/**
* Toggle state for how host labels should be displayed
*/
export enum Enum {
NONE,
NAME,
IP,
MAC
}
/**
* Add the method 'next()' to the HostLabelToggle enum above
*/
export function next(current: Enum) {
if (current === Enum.NONE) {
return Enum.NAME;
} else if (current === Enum.NAME) {
return Enum.IP;
} else if (current === Enum.IP) {
return Enum.MAC;
} else if (current === Enum.MAC) {
return Enum.NONE;
}
}
}
export namespace GridDisplayToggle {
/**
* Toggle state for how the grid should be displayed
*/
export enum Enum {
GRIDNONE,
GRID1000,
GRIDGEO,
GRIDBOTH
}
/**
* Add the method 'next()' to the GridDisplayToggle enum above
*/
export function next(current: Enum) {
if (current === Enum.GRIDNONE) {
return Enum.GRID1000;
} else if (current === Enum.GRID1000) {
return Enum.GRIDGEO;
} else if (current === Enum.GRIDGEO) {
return Enum.GRIDBOTH;
} else if (current === Enum.GRIDBOTH) {
return Enum.GRIDNONE;
}
}
}
/**
* model of the topo2CurrentRegion device props from Device below
*/
export interface DeviceProps {
latitude: string;
longitude: string;
gridX: number;
gridY: number;
name: string;
locType: LocationType;
uiType: string;
channelId: string;
managementAddress: string;
protocol: string;
driver: string;
}
export interface HostProps {
gridX: number;
gridY: number;
latitude: number;
longitude: number;
locType: LocationType;
name: string;
}
/**
* Implementing SimulationNodeDatum interface into our custom Node class
*/
export class Node implements UiElement, d3.SimulationNodeDatum {
// Optional - defining optional implementation properties - required for relevant typing assistance
index?: number;
x: number;
y: number;
vx?: number;
vy?: number;
fx?: number | null;
fy?: number | null;
nodeType: NodeType;
location: Location;
id: string;
protected constructor(id) {
this.id = id;
this.x = 0;
this.y = 0;
}
/**
* Static method to reset the node's position to that specified in its
* coordinates
* This is overridden for host
* @param node The node to reset
*/
static resetNodeLocation(node: Node): void {
let origLoc: MetaUi;
if (!node.location || node.location.locType === LocationType.NONE) {
// No location - nothing to do
return;
} else if (node.location.locType === LocationType.GEO) {
origLoc = ZoomUtils.convertGeoToCanvas(<LocMeta>{
lng: node.location.longOrX,
lat: node.location.latOrY
});
} else if (node.location.locType === LocationType.GRID) {
origLoc = ZoomUtils.convertXYtoGeo(
node.location.longOrX, node.location.latOrY);
}
Node.moveNodeTo(node, origLoc);
}
protected static moveNodeTo(node: Node, origLoc: MetaUi) {
const currentX = node.fx;
const currentY = node.fy;
const distX = origLoc.x - node.fx;
const distY = origLoc.y - node.fy;
let count = 0;
const task = setInterval(() => {
count++;
if (count >= 10) {
clearInterval(task);
}
node.fx = currentX + count * distX / 10;
node.fy = currentY + count * distY / 10;
}, 50);
}
static unpinOrFreezeNode(node: Node, freeze: boolean): void {
if (!node.location || node.location.locType === LocationType.NONE) {
if (freeze) {
node.fx = node.x;
node.fy = node.y;
} else {
node.fx = null;
node.fy = null;
}
}
}
}
export interface Badge {
status: string;
isGlyph: boolean;
txt: string;
msg: string;
}
/**
* model of the topo2CurrentRegion device from Region below
*/
export class Device extends Node {
id: string;
layer: LayerType;
metaUi: MetaUi;
master: string;
online: boolean;
props: DeviceProps;
type: string;
constructor(id: string) {
super(id);
}
}
export interface DeviceHighlight {
id: string;
badge: Badge;
}
export interface HostHighlight {
id: string;
badge: Badge;
}
/**
* Model of the ONOS Host element in the topology
*/
export class Host extends Node {
configured: boolean;
id: string;
ips: string[];
layer: LayerType;
props: HostProps;
constructor(id: string) {
super(id);
}
static resetNodeLocation(host: Host): void {
let origLoc: MetaUi;
if (!host.props || host.props.locType === LocationType.NONE) {
// No location - nothing to do
return;
} else if (host.props.locType === LocationType.GEO) {
origLoc = ZoomUtils.convertGeoToCanvas(<LocMeta>{
lng: host.props.longitude,
lat: host.props.latitude
});
} else if (host.props.locType === LocationType.GRID) {
origLoc = ZoomUtils.convertXYtoGeo(
host.props.gridX, host.props.gridY);
}
Node.moveNodeTo(host, origLoc);
}
}
/**
* model of the topo2CurrentRegion subregion from Region below
*/
export class SubRegion extends Node {
id: string;
location: Location;
nDevs: number;
nHosts: number;
name: string;
props: RegionProps;
constructor(id: string) {
super(id);
}
}
/**
* Enumerated values for topology update event types
*/
export enum ModelEventType {
HOST_ADDED_OR_UPDATED,
LINK_ADDED_OR_UPDATED,
DEVICE_ADDED_OR_UPDATED,
DEVICE_REMOVED,
HOST_REMOVED,
LINK_REMOVED,
}
/**
* Enumerated values for topology update event memo field
*/
export enum ModelEventMemo {
ADDED = 'added',
REMOVED = 'removed',
UPDATED = 'updated'
}