<classifier>features</classifier>
<type>xml</type>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>odl-groupbasedpolicy-ui</artifactId>
- <version>${project.version}</version>
- <classifier>features</classifier>
- <type>xml</type>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>odl-groupbasedpolicy-ip-sgt-distribution-service</artifactId>
After the first time it is very quick.
-1. Set up Vagrant.
+1. Set up Vagrant.
* Edit env.sh for NUM_NODES. (Keep all other vars the same for this version)
* Each VM takes approximately 1G RAM, 2GB used HDD (40GB)
* demo-gbp1: 3 VMs.
3. Start controller.
* Currently it is expected that that controller runs on the host hosting the VMs.
* Tested using groupbasedpolicy beryllium
- If you are building and get 'illegal unicode escape' error,
- you have to rename two yang files in 'groupbasedpolicy\ui-backend\src\main\yang'.
- These files have to start with a character other than 'u'.
+ If you are building and get 'illegal unicode escape' error,
+ you have to rename two yang files in 'groupbasedpolicy\ui-backend\src\main\yang'.
+ These files have to start with a character other than 'u'.
E.g. rename 'ui-backend.yang' to 'aui-backend.yang' and 'ui-backend-impl.yang' to 'aui-backend-impl.yang'.
* Start controller by running bin/karaf and install following features in karaf:
```
- feature:install odl-groupbasedpolicy-ofoverlay odl-groupbasedpolicy-ui odl-restconf
+ feature:install odl-groupbasedpolicy-ofoverlay odl-restconf
```
* Run `log:tail | grep renderer` and wait until the following message appears in the log:
* Now you can ^C the log:tail if you wish
#Demos:
-* demo-gbp1:
+* demo-gbp1:
* 8 docker containers in 2 x EPGs (web, client)
* contract with ICMP and HTTP
* demo-symmetry:
` ./startdemo.sh demo-gbp1`
After this, `infrastructure_config.py` will be copied from `/demo-gbp1`, and you are ready to start testing.
-
+
###To test:
SSH to test VM (may take some seconds):
```
Notice there are containers from two different endpoint groups, "h35" and "h36".
-Enter into the shell on one of "h36" (web) container (on `gbpsfc1` it will be `h36_4`, its IP is `10.0.36.4`,
+Enter into the shell on one of "h36" (web) container (on `gbpsfc1` it will be `h36_4`, its IP is `10.0.36.4`,
you will need it later).
*(You need double ENTER after `docker attach`)*
```bash
Press `Ctrl-P-Q` to return to your root shell on `gbpsfc1`
-Enter into one of "h35" (client) container,
-ping the container where HTTP server runs,
+Enter into one of "h35" (client) container,
+ping the container where HTTP server runs,
and connect to index page:
-*We use eternal loop here to imitate web activity.
+*We use eternal loop here to imitate web activity.
After finishing your test, you might want to stop the loop with `Ctrl-C`*
```
docker attach h35_{x}
Ctrl-P-Q to detach from docker, leaving the client making HTTP requests, and logoff gbpsfc1.
-Look around: use "vagrant ssh" to the various machines
+Look around: use "vagrant ssh" to the various machines
* take packet captures on eth1.
* sudo ovs-dpctl dump-flows`
You need to install following features in ODL (logs are optional)::
- feature:install odl-vbd-ui odl-groupbasedpolicy-ui odl-groupbasedpolicy-neutron-vpp-mapper odl-restconf
+ feature:install odl-vbd-ui odl-groupbasedpolicy-neutron-vpp-mapper odl-restconf
log:set ERROR org.opendaylight.netconf
log:set TRACE org.opendaylight.groupbasedpolicy.renderer.vpp
<type>xml</type>
<classifier>features</classifier>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>odl-groupbasedpolicy-ui</artifactId>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>odl-groupbasedpolicy-ip-sgt-distribution-service</artifactId>
<type>xml</type>
<classifier>features</classifier>
</dependency>
- <dependency>
- <groupId>org.opendaylight.sfc</groupId>
- <artifactId>odl-sfc-ui</artifactId>
- <version>${sfc.version}</version>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
</dependencies>
</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.opendaylight.odlparent</groupId>
- <artifactId>single-feature-parent</artifactId>
- <version>3.0.2</version>
- <relativePath/>
- </parent>
-
- <groupId>org.opendaylight.groupbasedpolicy</groupId>
- <artifactId>odl-groupbasedpolicy-ui</artifactId>
- <version>0.8.0-SNAPSHOT</version>
- <packaging>feature</packaging>
- <!--
- UI
- -->
- <!-- <name> formatting is used by autorelease to parse and notify projects on
- build failure. Please do not modify this unless you have a good reason. -->
- <name>ODL :: groupbasedpolicy :: ${project.artifactId}</name>
-
- <dependencyManagement>
- <dependencies>
- <!-- ODL-GBP-ARTIFACTS -->
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>groupbasedpolicy-artifacts</artifactId>
- <version>${project.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>groupbasedpolicy-ui-bundle</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.dlux</groupId>
- <artifactId>odl-dlux-core</artifactId>
- <version>0.8.0-SNAPSHOT</version>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
- </dependencies>
-</project>
<module>odl-groupbasedpolicy-neutron-and-ofoverlay</module>
<module>odl-groupbasedpolicy-vpp</module>
<module>odl-groupbasedpolicy-neutron-vpp-mapper</module>
- <module>odl-groupbasedpolicy-ui</module>
<module>odl-groupbasedpolicy-ip-sgt-distribution-service</module>
<module>odl-groupbasedpolicy-ne-location-provider</module>
<module>odl-groupbasedpolicy-ios-xe</module>
+++ /dev/null
-module/node
-module/src/main/resources/gbp/node_modules
-module/src/main/resources/gbp/vendor
-module/src/main/resources/gbp/node/
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.opendaylight.groupbasedpolicy</groupId>
- <artifactId>groupbasedpolicy-ui</artifactId>
- <version>0.8.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>groupbasedpolicy-ui-bundle</artifactId>
- <!-- <name> formatting is used by autorelease to parse and notify projects on
- build failure. Please do not modify this unless you have a good reason. -->
- <name>ODL :: groupbasedpolicy :: ${project.artifactId}</name>
- <packaging>bundle</packaging>
-
- <properties>
- <dlux.version>0.8.0-SNAPSHOT</dlux.version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.dlux</groupId>
- <artifactId>loader</artifactId>
- <version>${dlux.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.groupbasedpolicy</groupId>
- <artifactId>groupbasedpolicy-ui-module</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.1.0</version>
- </dependency>
- </dependencies>
- <build>
- <resources>
- <resource>
- <directory>target/generated-resources</directory>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- </resource>
- </resources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <!--loader Resources-->
- <execution>
- <id>unpack-loader-resources</id>
- <goals>
- <goal>unpack-dependencies</goal>
- </goals>
- <phase>generate-resources</phase>
- <configuration>
- <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
- <groupId>org.opendaylight.dlux</groupId>
- <includeArtifactIds>groupbasedpolicy-ui-module</includeArtifactIds>
- <includes>gbp/build\/**</includes>
- <excludes>META-INF\/**,gbp/node\/**,gbp/node_modules\/**</excludes>
- <excludeTransitive>true</excludeTransitive>
- <ignorePermissions>false</ignorePermissions>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Import-Package>
- org.osgi.service.http,
- org.osgi.framework;version="1.0.0",
- org.opendaylight.dlux.loader,
- org.slf4j
- </Import-Package>
- <Export-Package></Export-Package>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <scm>
- <connection>scm:git:ssh://git.opendaylight.org:29418/dlux.git</connection>
- <developerConnection>scm:git:ssh://git.opendaylight.org:29418/dlux.git</developerConnection>
- <tag>HEAD</tag>
- <url>https://wiki.opendaylight.org/view/OpenDaylight_dlux:Main</url>
- </scm>
-</project>
+++ /dev/null
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
- <reference id="httpService" availability="mandatory" activation="eager" interface="org.osgi.service.http.HttpService"/>
- <reference id="loader" availability="mandatory" activation="eager" interface="org.opendaylight.dlux.loader.DluxModuleLoader"/>
- <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.opendaylight.dlux.loader.DluxModule">
- <property name="httpService" ref="httpService"/>
- <property name="loader" ref="loader"/>
- <property name="moduleName" value="gbp"/>
- <property name="url" value="/src/app/gbp"/>
- <property name="directory" value="/gbp/build"/>
- <property name="requireJs" value="app/gbp/main"/>
- <property name="angularJs" value="app.gbp"/>
- <property name="cssDependencies">
- <list>
- <value>src/app/gbp/common/gbp.css</value>
- <value>src/app/gbp/vendor/angular-material/angular-material.min.css</value>
- <value>src/app/gbp/vendor/angular-material-data-table/dist/md-data-table.min.css</value>
- <value>src/app/gbp/vendor/roboto-fontface/css/roboto-fontface.css</value>
- <value>src/app/gbp/vendor/NeXt/css/next.min.css</value>
- <value>https://fonts.googleapis.com/icon?family=Material+Icons</value>
- <value>http://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css</value>
- </list>
- </property>
- </bean>
-</blueprint>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2014 Inocybe Technologies, and others. All rights reserved.
-
- This program and the accompanying materials are made available under the
- terms of the Eclipse Public License v1.0 which accompanies this distribution,
- and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.opendaylight.groupbasedpolicy</groupId>
- <artifactId>groupbasedpolicy-ui</artifactId>
- <version>0.8.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>groupbasedpolicy-ui-module</artifactId>
- <!-- <name> formatting is used by autorelease to parse and notify projects on
- build failure. Please do not modify this unless you have a good reason. -->
- <name>ODL :: groupbasedpolicy :: ${project.artifactId}</name>
- <description>GBP UI Module Resources</description>
- <packaging>jar</packaging>
-
- <build>
- <plugins>
- <plugin>
- <groupId>com.github.eirslett</groupId>
- <artifactId>frontend-maven-plugin</artifactId>
- <version>1.0</version>
- <configuration>
- <nodeVersion>v6.2.2</nodeVersion>
- <npmVersion>3.9.5</npmVersion>
- <workingDirectory>src/main/resources/gbp/</workingDirectory>
- </configuration>
- <executions>
- <execution>
- <id>npm</id>
- <goals>
- <goal>install-node-and-npm</goal>
- <goal>npm</goal>
- </goals>
- <phase>generate-resources</phase>
- </execution>
- <execution>
- <id>bower</id>
- <goals>
- <goal>bower</goal>
- </goals>
- </execution>
- <execution>
- <id>gulp</id>
- <goals>
- <goal>gulp</goal>
- </goals>
- <configuration>
- <arguments>build</arguments>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
+++ /dev/null
-{
- "directory" : "vendor"
-}
\ No newline at end of file
+++ /dev/null
-node_modules/
-vendor/
-build/
+++ /dev/null
-{
- "name": "opendaylight-gbp",
- "version": "0.5.0",
- "dependencies": {
- "angular-animate": "~1.4.0",
- "angular-aria": "~1.4.0",
- "angular-material": "1.0.5",
- "roboto-fontface": "~0.4.3",
- "angular-material-data-table": "~0.9.11",
- "NeXt": "~0.9.1"
- },
- "resolutions": {
- "angular": "~1.4.0"
- }
-}
+++ /dev/null
-/**
- * This file/module contains all configuration for the build process.
- */
-module.exports = {
- /**
- * The `build_dir` folder is where our projects are compiled during
- * development and the `compile_dir` folder is where our app resides once it's
- * completely built.
- */
- build_dir: 'build',
- app_dir: 'app',
-
- /**
- * This is a collection of file patterns that refer to our app code (the
- * stuff in `src/`). These file paths are used in the configuration of
- * build tasks. `js` is all project javascript, less tests. `ctpl` contains
- * our reusable components' (`src/common`) template HTML files, while
- * `atpl` contains the same, but for our app's code. `html` is just our
- * main HTML file, `less` is our main stylesheet, and `unit` contains our
- * app's unit tests.
- */
- app_files: {
- js: ['*/**/*.js', '!node/**/*.*', '!node_modules/**/*.*', '!vendor/**/*.*'],
- root_js: ['main.js'],
-
- templates: ['*/**/*.tpl.html'],
- },
-
- assets_files: {
- css: ['common/*.css'],
- },
-
- /**
- * This is a collection of files used during testing only.
- */
-
-
- /**
- * This is the same as `app_files`, except it contains patterns that
- * reference vendor code (`vendor/`) that we need to place into the build
- * process somewhere. While the `app_files` property ensures all
- * standardized files are collected for compilation, it is the user's job
- * to ensure non-standardized (i.e. vendor-related) files are handled
- * appropriately in `vendor_files.js`.
- *
- * The `vendor_files.js` property holds files to be automatically
- * concatenated and minified with our project source files.
- *
- * The `vendor_files.css` property holds any CSS files to be automatically
- * included in our app.
- *
- * The `vendor_files.assets` property holds any assets to be copied along
- * with our app's assets. This structure is flattened, so it is not
- * recommended that you use wildcards.
- */
- vendor_files: {
- js: [
- 'angular-material/angular-material.min.js',
- 'angular-animate/angular-animate.min.js',
- 'angular-aria/angular-aria.min.js',
- 'angular-material-data-table/dist/md-data-table.min.js',
- 'angular-messages/angular-messages.min.js',
- 'NeXt/js/next.min.js',
- ],
- css: [
- 'angular-material/angular-material.min.css',
- 'roboto-fontface/css/roboto-fontface.css',
- 'angular-material-data-table/dist/md-data-table.min.css',
- 'NeXt/css/next.min.css',
-
- ],
- fonts: [
- 'roboto-fontface/fonts/*.*',
- 'NeXt/fonts/*.*',
- ]
- }
-
-};
+++ /dev/null
-define([
- 'app/gbp/common/gbp.service',
- 'app/gbp/resolved-policy/resolved-policy-list.service',
- 'app/gbp/endpoints/sxp-mapping-list.service'
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('RootGbpCtrl', RootGbpCtrl);
-
- RootGbpCtrl.$inject = ['$mdDialog', '$rootScope', '$scope', '$state',
- 'EndpointsListService', 'NextTopologyService', 'ResolvedPolicyListService', 'RootGbpService',
- 'TenantListService', 'SxpMappingListService'];
-
- function RootGbpCtrl($mdDialog, $rootScope, $scope, $state,
- EndpointsListService, NextTopologyService, ResolvedPolicyListService, RootGbpService,
- TenantListService, SxpMappingListService) {
-
- /* properties */
- $scope.apiType = 'operational';
- $scope.activeObject = null;
- $scope.endpoints = EndpointsListService.createList();
- $scope.endpointSgtList = SxpMappingListService.createList();
- $scope.innerObj = {};
- $scope.rootTenant = null;
- $scope.rootTenants = TenantListService.createList();
- $scope.resolvedPolicy = {};
- $scope.sidePanelObject = null;
- $scope.sidePanelPage = false;
- $scope.sidePanelPageEndpoint = false;
- $scope.stateUrl = null;
- $scope.topologyData = { nodes: [], links: [] };
- $scope.viewPath = 'src/app/gbp/';
-
- var resolvedPolicies = ResolvedPolicyListService.createList();
- getResolvedPolicies();
-
- /* methods */
- $scope.broadcastFromRoot = broadcastFromRoot;
- $scope.closeSidePanel = closeSidePanel;
- $scope.openSfcDialog = openSfcDialog;
- $scope.openSidePanel = openSidePanel;
- $scope.setRootTenant = setRootTenant;
- $scope.fillTopologyData = fillTopologyData;
- $scope.highlightNode = highlightNode;
- $scope.highlightLink = highlightLink;
- $scope.fadeAll = fadeAll;
- $scope.rootOpenEndpointDialog = rootOpenEndpointDialog;
- $scope.rootDeleteEndpointDialog = rootDeleteEndpointDialog;
-
- RootGbpService.setMainClass();
- init();
-
- /* implementations */
-
- /**
- *
- * @param eventName
- * @param val
- */
- function broadcastFromRoot(eventName, val) {
- $scope.$broadcast(eventName, val);
- }
-
- /**
- *
- */
- function closeSidePanel() {
- if($scope.sidePanelPage) {
- $scope.sidePanelPage = false;
- $scope.sidePanelObject = null;
- $scope.fadeAll();
- }
- }
-
- /**
- *
- * @param source
- * @param target
- * @param contract
- * @param tenant
- * @returns {{id: string, source: *, target: *, tenant: *}}
- */
- function createLink( linkId, type) {
- var linkIdParts = linkId.split('++');
- return {
- 'id': linkId,
- 'source': linkIdParts[1],
- 'target': linkIdParts[2],
- 'tenant': $scope.rootTenant,
- 'type': type,
- };
- }
-
- /**
- *
- * @param nodeName
- * @param tenantId
- * @returns {Object}
- */
- function createNode(nodeName) {
- return {
- 'id': nodeName,
- 'tenantId': $scope.rootTenant,
- 'node-id': nodeName,
- 'label': nodeName,
- };
- }
-
- /**
- *
- */
- function fadeAll() {
- $rootScope.nxTopology && NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
- }
-
- /**
- * reads resolvedPolicies list, prepares nodes and links for topology and fills them
- */
- function fillTopologyData() {
- var tempTopoData = {nodes: [], links: []};
- $scope.resolvedPolicy = resolvedPolicies.aggregateResolvedPolicies();
-
- tempTopoData.nodes = Object.keys($scope.resolvedPolicy.epgs).map(function (key) {
- return createNode(key);
- });
-
- tempTopoData.links = Object.keys($scope.resolvedPolicy.contracts).map(function (key) {
- return createLink(key, $scope.resolvedPolicy.contracts[key].type);
- });
-
- $scope.topologyData = tempTopoData;
- $scope.topologyLoaded = true;
- }
-
- function getResolvedPolicies() {
- if($scope.rootTenant) {
- resolvedPolicies.get($scope.rootTenant, fillTopologyData);
- }
- }
-
- /**
- *
- * @param node
- */
- function highlightNode(node) {
- NextTopologyService.highlightNode($rootScope.nxTopology, node);
- }
-
- /**
- *
- * @param link
- */
- function highlightLink(link) {
- NextTopologyService.highlightLink($rootScope.nxTopology, link);
- }
-
- /**
- *
- */
- function init() {
- $scope.rootTenants.clearData();
- $scope.rootTenants.get('config');
- $state.go('main.gbp.index.resolvedPolicy');
- $scope.endpointSgtList.get();
-
-
- }
-
- /**
- *
- * @param chainName
- */
- function openSfcDialog(chainName) {
- $mdDialog.show({
- clickOutsideToClose: true,
- controller: 'SfcTopologyController',
- preserveScope: true,
- templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
- parent: angular.element(document.body),
- scope: $scope,
- locals: {
- chainName: chainName
- }
- });
- }
-
-
- /**
- * Sets '$scope.sidePanelPage' to true. This variable is watched in index.tpl.html template
- * and opens/closes side panel
- */
- function openSidePanel(page, object, type, element) {
- $scope.sidePanelPage = page;
- $scope.sidePanelObject = object;
-
- switch(type) {
- case 'subject':
- $scope.innerObj.subject = element;
- break;
- case 'clause':
- $scope.innerObj.clause = element;
- break;
- case 'rule':
- $scope.innerObj.rule = element;
- break;
- default:
- }
- }
-
- /**
- *
- */
- function setRootTenant() {
- $scope.broadcastFromRoot('ROOT_TENANT_CHANGED');
-
- if ($scope.stateUrl.startsWith('/resolved-policy')) {
- getResolvedPolicies();
- if($scope.sidePanelObject) {
- if($scope.sidePanelObject['contract-id'])
- openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel');
- else
- openSidePanel('resolved-policy/sidepanel/views/epg-list-sidepanel');
- }
- }
- }
-
- /**
- * fills $scope.stateUrl with loaded url
- * It's called on $viewContentLoaded event
- */
- function setStateUrl() {
- $scope.stateUrl = $state.current.url;
- closeSidePanel();
-
- if ($scope.stateUrl.startsWith('/resolved-policy')) {
- getResolvedPolicies();
- }
- }
-
- function rootOpenEndpointDialog(operation, endpointData) {
- $scope.disableKeyFieldsEditing = operation === 'edit';
- $mdDialog.show({
- clickOutsideToClose: true,
- controller: 'AddEndpointController',
- preserveScope: true,
- templateUrl: $scope.viewPath + 'endpoints/dialog-add-endpoint.tpl.html',
- parent: angular.element(document.body),
- scope: $scope,
- locals: {
- endpoint: endpointData
- }
- });
- }
-
- function rootDeleteEndpointDialog(endpointData) {
- var confirm = $mdDialog.confirm()
- .title('Delete endpoint')
- .textContent('Do you want to delete endpoint?')
- .ok('Delete')
- .cancel('Cancel');
-
- $mdDialog.show(confirm).then(function () {
- endpointData.deleteEndpoint(function () {
- $scope.$broadcast('endpointChanged');
- });
- }, function () {
-
- });
- }
-
- /* event listeners */
- /**
- * Event fired after content loaded, setStateUrl function is called to fill stateUrl method
- */
- $scope.$on('$viewContentLoaded', setStateUrl);
- }
-});
+++ /dev/null
-#page_logo {
- display: none;
-}
-
-.h100 {
- height:100%
-}
-
-.w100 {
- width:100%
-}
-
-.gbpUiGlobalWrapper {
- background: #ffffff;
- margin-bottom: 0!important;
- min-height: 100%;
- padding: 0px;
-}
-
-.gbpUiGlobalWrapper .main {
- top: 0px;
- height: 100%;
-}
-
-.gbpUiWrapper {
- background-color: #414042;
-}
-
-.gbpUiWrapper .pageContent {
- margin: 0px;
- padding: 0px;
- width: 100%;
- height: 100%;
-}
-
-.gbpUiWrapper .side-panel {
- width: 400px;
- color: #000 ! important;
- border: 1px solid #000;
-}
-
-.gbpUiWrapper .h100 {
- height: 100%;
-}
-
-.gbpUiWrapper.w100 {
- width: 100%;
-}
-
-.gbpUiWrapper.flt-r {
- float: right;
-}
-
-/* LAYOUT */
-.layout-padding-lr15 {
- padding: 0 15px;
-}
-
-/* TABLES */
-.gbpUiWrapper .md-table span {
- color: rgba(0,0,0,.87);
-}
-.gbpUiWrapper .md-table-pagination span {
- color: rgba(0,0,0,.87);
- font-weight: normal;
-}
-.gbpUiWrapper button.md-button.md-icon-button.w85 {
- width: 85px;
-}
-
-/* BUTTONS */
-.gbpUiWrapper button.md-primary span {
- color: rgb(33,150,243);
-}
-.gbpUiWrapper button .md-icon {
- width: 30px;
-}
-
-/* DIALOG */
-.gbpDialogWrapper button.md-primary span {
- color: rgba(0,0,0,0.87);
-}
-.gbpDialogWrapper button.md-primary[disabled] span {
- color: rgba(0,0,0,0.26);
-}
-
-.gbpUiWrapper svg, div#next-vpp-topo svg {
- border: none;
- background-image: none;
-}
-
-.gbpUiWrapper svg g.node text {
- pointer-events: auto !important;
-}
-
-.expander md-content {
- line-height: 15px;
- width: 100%;
-}
-
-.expander .md-list-item-inner {
- flex-flow: row wrap;
-}
-
-.expand-button {
- min-width: 0px !important;
- min-height: 0px !important;
- margin-top: 0 !important;
- margin-bottom: 0 !important;
- line-height: normal !important;
-}
-
-#graph-container {
- padding-left: 0;
- background-color: #ffffff;
- width: 100%;
- height: 100%;
-}
-
-/* $mdDialog.confirm */
-md-dialog button span {
- color: #000;
-}
-
-div.layout-padding h3 {
- color: black;
-}
-
-md-sidenav span {
- color: inherit !important;
-}
-
-div.md-primary.md-subheader.ng-scope > div > span > span {
- color: rgb(33,150,243);
-}
-
-.md-subheader {
- font-weight: bold !important;
-}
-
-md-sidenav > md-toolbar > div > h2 > span {
- margin: 20px 0;
- color: #666;
-}
-
-span.flex-35 > strong {
- color: rgba(0,0,0,0.87);
-}
-
-span.ng-binding.flex {
- color: rgba(0,0,0,0.87);
-}
-
-md-select:not([disabled]) .md-select-value .md-text {
- color: black;
-}
-
-.md-input-has-value label {
- color: rgba(0,0,0,0.54);
-}
-
-md-select-value span {
- color: rgba(0,0,0,0.26);
- font-weight: bold;
- margin-bottom: 5px;
- line-height: 1.428571429;
-}
-
-md-select-value span div {
- font-weight: normal;
-}
-
-.md-chips {
- padding: 0 0 0 0 !important;
-}
-
-md-dialog-content > div:first-child {
- padding-top: 20px;
- padding-bottom: 20px;
-}
-
-.gbpUiGlobalWrapper .md-locked-open {
- width: 500px;
- min-width: 500px;
-}
-
-.breadcrumbs {
- display: inline-block;
- font-size: 16px;
- font-weight: 500;
- line-height: 1em;
- padding-left: 0;
- margin: 10px 0;
-}
-
-.breadcrumbs .breadcrumb {
- display: inline-block;
- color: rgba(0,0,0,.54);
- background-color: transparent;
- padding: 0;
- font-size: 13px;
- margin-bottom: 0 !important;
- vertical-align: middle;
- max-height: 20px;
- line-height: 20px;
-}
-
-.breadcrumbs .breadcrumb[role="button"] {
- color: rgb(33, 150, 243);
- cursor: pointer;
-}
-
-.breadcrumb i {
- font-size: 20px !important;
-}
-
-.layout-padding-r10 {
- padding-right: 10px;
-}
-
-.layout-padding-b15 {
- padding-bottom: 15px;
-}
-
-.order {
- color: #000 !important;
- margin: 0;
-}
-
-.status-circle.allow {
- color: green;
-}
-
-.status-circle.require-contract {
- color: orange;
-}
-
-md-ink-bar {
- background: red !important;
-}
-
-md-tab-item > span {
- color: rgba(0,0,0,0.54);
-}
-
-md-tab-item.md-tab.ng-scope.ng-isolate-scope.md-ink-ripple.md-active > span {
- color: rgb(16,108,200);
-}
-
-.layout-padding-lr15.ng-scope.layout-column > div {
- padding-top: 15px;
-}
-
-div.md-primary.md-subheader > div > span > span {
- color: rgb(33,150,243);
-}
-
-div.md-secondary.md-subheader.ng-scope > div > span > span {
- color: rgb(33,150,243) !important;
-}
-
-li > md-autocomplete-parent-scope > span {
- color: rgba(0,0,0,.54);
-}
-
-#tenantSelector div, #tenantSelector .md-select-placeholder span {
- color: white;
- font-weight: normal;
-}
-
-md-input-container md-select md-select-value span {
- font-weight: 500;
- font-size: 14px;
- font-style: inherit;
- font-variant: inherit;
- font-family: inherit;
- letter-spacing: 0.010em;
-}
-
-#select_container_1 {
- z-index:1001;
-}
-
-md-list-item.md-4-line .md-list-item-text h3{
- font-size: 16px;
- font-weight: 400;
- letter-spacing: 0.010em;
- margin: 0 0 0px 0;
- line-height: 1.2em;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- color: rgba(0,0,0,0.87);
-}
-
-md-list-item.md-4-line .md-list-item-text p {
- font-size: 14px;
- font-weight: 500;
- letter-spacing: 0.010em;
- margin: 0 0 0 0;
- line-height: 1.6em;
- color: rgba(0,0,0,0.54);
-}
-
-
-md-list-item.md-4-line {
- height: auto;
- min-height: 100px;
-}
-
-section.legendBox{
- position: absolute !important;
- right: 0;
- top: 0;
- z-index: 1;
- width: 200px;
-}
-
-section.legendBox ul li {
- list-style-type: none;
-}
-
-.reload-button i {
- vertical-align: middle;
-}
-
-section.legendBox ul .line.green {
- border-top: 2px solid #68bd6b;
-}
-
-section.legendBox ul .line.blue {
- border-top: 2px solid #84a3ff;
-}
-
-section.legendBox ul .line {
- display: -moz-inline-stack;
- display: inline-block;
- vertical-align: top;
- zoom: 1;
- margin: 9px 5px 0 0;
- width: 50px;
-}
-
-.margin-lr0 {
- margin-right: 0 !important;
- margin-left: 0 !important;
-}
-
-.popover-title {
- color: black;
-}
-
-.popover-content span {
- color: black;
-}
-
-.popover-content h5 {
- color: black;
-}
-
-.n-topology-nav-setting > span {
- color: #999999;
-}
+++ /dev/null
-define([
- 'app/routingConfig',
- 'Restangular',
- 'angular-translate-loader-partial',
- 'angular-animate',
- 'angular-aria',
- 'angular-material',
- 'angular-material-data-table',
- 'angular-messages',
- 'app/gbp/common/topology/next_topology.module',], function () {
-
- var gbp = angular.module('app.gbp',
- [
- 'app.core', 'ui.router.state', 'restangular', 'ngAnimate', 'ngAria', 'ngMaterial', 'md.data.table',
- 'ngMessages', 'app.nextTopo',
- ]);
-
- gbp.register = gbp; // for adding services, controllers, directives etc. to angular module before bootstrap
-
- gbp.config(function ($stateProvider, $compileProvider, $controllerProvider, $provide, NavHelperProvider,
- $translateProvider, $translatePartialLoaderProvider, $urlRouterProvider, $mdThemingProvider) {
- gbp.register = {
- controller: $controllerProvider.register,
- directive: $compileProvider.directive,
- factory: $provide.factory,
- service: $provide.service,
- };
-
- $urlRouterProvider.otherwise('/gbp/index');
-
- /*$translatePartialLoaderProvider.addPart('app/gbp/assets/data/locale');*/
-
- NavHelperProvider.addControllerUrl('app/gbp/common/gbp.controller');
- NavHelperProvider.addControllerUrl('app/gbp/contract/add-contract.controller');
- NavHelperProvider.addControllerUrl('app/gbp/contract/contract.controller');
- NavHelperProvider.addControllerUrl('app/gbp/endpoints/endpoints.controller');
- NavHelperProvider.addControllerUrl('app/gbp/endpoints/add-endpoint.controller');
- NavHelperProvider.addControllerUrl('app/gbp/epg/epg.controller');
- NavHelperProvider.addControllerUrl('app/gbp/policy/policy.controller');
- NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/resolved-policy.controller');
- NavHelperProvider.addControllerUrl('app/gbp/sfc/dialog-sfc-topology.controller');
- NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/epg-sidepanel.controller');
- NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/epg-list-sidepanel.controller');
- NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/contract-sidepanel.controller');
- NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/contract-list-sidepanel.controller');
- NavHelperProvider.addControllerUrl('app/gbp/tenant/add-tenant.controller');
- NavHelperProvider.addControllerUrl('app/gbp/tenant/tenant.controller');
-
- NavHelperProvider.addToMenu('gbp', {
- 'link': '#/gbp/index',
- 'active': 'main.gbp',
- 'title': 'GBP',
- 'icon': 'icon-level-down',
- 'page': {
- 'title': 'GBP',
- 'description': 'GBP ui'
- }
- });
-
- var access = routingConfig.accessLevels;
-
- $stateProvider.state('main.gbp', {
- url: 'gbp',
- abstract: true,
- // access: access.public,
- views: {
- 'content': {
- templateUrl: 'src/app/gbp/common/views/root.tpl.html'
-
- },
- },
- });
-
- $stateProvider.state('main.gbp.index', {
- url: '/index',
- access: access.admin,
- views: {
- '': {
- controller: 'RootGbpCtrl',
- templateUrl: 'src/app/gbp/common/views/index.tpl.html'
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.tenant', {
- url: '/tenant',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- '': {
- controller: 'TenantController',
- templateUrl: 'src/app/gbp/tenant/tenant.tpl.html',
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.policy', {
- url: '/policy',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- 'main_top': {
- controller: 'EpgController',
- templateUrl: 'src/app/gbp/epg/epg.tpl.html',
- },
- 'main_bottom': {
- controller: 'ContractController',
- templateUrl: 'src/app/gbp/contract/contract.tpl.html',
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.policy.epg', {
- url: '/epg',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- '': {
- controller: 'PolicyController',
- templateUrl: 'src/app/gbp/policy/policy.tpl.html',
- },
- 'sidePanel': {
- controller: 'EpgController',
- templateUrl: 'src/app/gbp/epg/epg.tpl.html',
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.contract', {
- url: '/policy/contract',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- '': {
- controller: 'ContractController',
- templateUrl: 'src/app/gbp/contract/contract.tpl.html',
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.contractId', {
- url: '/policy/contract/{contractId}',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- '': {
- controller: 'ContractController',
- templateUrl: 'src/app/gbp/contract/contract.tpl.html',
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.resolvedPolicy', {
- url: '/resolved-policy',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- '': {
- controller: 'ResolvedPolicyController',
- templateUrl: 'src/app/gbp/resolved-policy/resolved-policy.tpl.html',
- },
- },
- });
-
- $stateProvider.state('main.gbp.index.endpoints', {
- url: '/endpoints',
- access: access.admin,
- templateUrl: 'src/app/gbp/common/views/index.tpl.html',
- views: {
- '': {
- controller: 'EndpointsController',
- templateUrl: 'src/app/gbp/endpoints/endpoints.tpl.html',
- },
- },
- });
-
- $mdThemingProvider.theme('default')
- .primaryPalette('blue')
- .accentPalette('blue-grey');
- });
-
- return gbp;
-});
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('RootGbpService', RootGbpService);
-
- RootGbpService.$inject = [];
-
- function RootGbpService() {
- this.setMainClass = setMainClass;
-
- /**
- * Sets gbpUiGlobalWrapper to override padding on parent class
- */
- function setMainClass(){
- if ($('.gbpUiWrapper').length) {
- $('.gbpUiWrapper').closest('.col-xs-12').addClass('gbpUiGlobalWrapper');
- }
- }
- }
-
- return RootGbpService;
-});
+++ /dev/null
-define(['next-ui'], function() {
-
- var NextTopology = function (NextTopologyService){
- return {
- restrict: 'E',
- scope: {
- topologyData: '=',
- cbkFunctions: '=?',
- dictionaries: '=?',
- topo: '=?',
- topoColors: '=?'
- },
- template: '<div id="graph-container" class="col-md-12"></div>',
- link: function(scope) {
- var saveTopoInterval = null;
-
- scope.topo = null;
-
- /**
- * Colors used for topology objects
- * @type {nx.data.Dictionary}
- */
- scope.topoColors = new nx.data.Dictionary({
- 'operational': '#0f9d58',
- 'configured': '#464646',
- 'operational-mixed': '#C4AF00',
- 'down': '#FF0000',
- 'default': '#8C8C8C',
- 'forwarding-box': '#0386d2',
- 'host': '#8C8C8C'
- });
-
- /**
- * init next topology graph
- */
- scope.init = function (successCbk) {
- // register "font" icon
- nx.graphic.Icons.registerFontIcon('devicedown', 'FontAwesome', "\uf057", 20);
-
- var circle = "<defs xmlns='http://www.w3.org/2000/svg'><marker id='circle' viewBox='-3 -3 6 6' markerWidth='6' markerHeight='6' orient='auto'> <circle r='3' fill='#68BD6B'></circle></marker></defs>";
-
- var app = new nx.ui.Application();
- // set app containter
- document.getElementById('graph-container').innerHTML = '';
- app.container(document.getElementById('graph-container'));
-
- scope.topo = NextTopologyService.getNxTopClass(scope.topoColors);
- scope.setTopoEvents();
- scope.topo.stage().addDefString(circle);
-
- extendLinkClass();
- extendNodeClass();
- extendedTooltip();
- // TODO: remove when come to decision about depiction of node status
- //createNodeStatusLayer();
- defineCustomEvents();
-
-
-
- // App events - if app is resized
- app.on('resize', function(){
- scope.topo.adaptToContainer();
- });
-
- // Attach topo to app
- scope.topo.attach(app);
-
- if ( successCbk ) {
- successCbk();
- }
- };
-
- /**
- * NX topo events
- */
- scope.setTopoEvents = function () {
- // Fired when the app is ready and displayed
- scope.topo.on('ready', function (sender, event) {
- scope.topo.data(scope.topologyData);
-
- // load saved data
- if ( scope.dictionaries ){
- var data = NextTopologyService.readTopologyDataFromLS();
- NextTopologyService.setTopologyDataFromLS(data, scope.topo, scope.dictionaries.nodes);
- }
-
- // clear interval after reload data
- if ( saveTopoInterval ) {
- clearInterval(saveTopoInterval);
- }
-
- // set interval for saving topo nodes position
- saveTopoInterval = window.setInterval(function(){NextTopologyService.saveTopologyDataToLS(scope.topo);}, 5000);
- });
-
- // Fired when topology is generated
- scope.topo.on('topologyGenerated', function(sender, event) {
-
- // use custom events for the topology
- // TODO: remove when come to decision about depiction of node status
- //sender.attachLayer("status", "NodeStatus");
- sender.registerScene('ce', 'CustomEvents');
- sender.activateScene('ce');
- scope.topo.tooltipManager().showNodeTooltip(false);
- });
- };
-
- /**
- * Watching topology data
- */
- scope.$watch('topologyData', function(){
- //console.log('scope.topologyData', scope.topologyData);
-
- //if( scope.topologyData.nodes.length ) { //&& initialized === false
- scope.init(scope.cbkFunctions.topologyGenerated);
- //}
- });
-
- /**
- * Extend base nx node class function
- */
- function extendNodeClass(){
- nx.define('ExtendedNode', nx.graphic.Topology.Node, {
- view: function(view){
-
- view.content.push({
- "name": "deviceDownBadge",
- "type": "nx.graphic.Group",
- "content": [
- {
- "name": "deviceDownBadgeBg",
- "type": "nx.graphic.Rect",
- "props": {
- "class": "device-down-bg",
- "height": 1,
- "visible": false
- }
- },
- {
- "name": "deviceDownBadgeText",
- "type": "nx.graphic.Icon",
- "props": {
- "class": "icon",
- "iconType": "devicedown",
- "color": "#ff0000",
- "showIcon": true,
- "scale": 1,
- "visible": false
- }
- }
- ]
- });
- return view;
- },
- methods: {
- // inherit properties/parent's data
- init: function(args){
- this.inherited(args);
- var stageScale = this.topology().stageScale();
- this.view('label').setStyle('font-size', 14 * stageScale);
- },
- // inherit parent's model
- 'setModel': function(model) {
- this.inherited(model);
-
- // if status is down
- this._drawDeviceDownBadge(this.model());
-
- },
- "_drawDeviceDownBadge": function(model){
-
- var badge, badgeBg, badgeText,
- icon, iconSize, iconScale,
- bound, boundMax, badgeTransform,
- badgeVisibility = model.get("status") === "configured";
-
- // views of badge
- badge = this.view("deviceDownBadge");
- badgeBg = this.view("deviceDownBadgeBg");
- badgeText = this.view("deviceDownBadgeText");
-
- // view of device icon
- icon = this.view('icon');
- iconSize = icon.size();
- iconScale = icon.scale();
-
- // define position of the badge
- badgeTransform = {
- x: iconSize.width * iconScale / -2.5,
- y: iconSize.height * iconScale / 3
- };
-
- // make badge visible
- badgeText.set("visible", badgeVisibility);
-
- // get bounds and apply them for white background
- bound = badge.getBound();
- boundMax = Math.max(bound.width - 6, 1);
- badgeBg.sets({
- width: boundMax,
- visible: badgeVisibility
- });
-
- // set position of the badge
- badgeBg.setTransform(badgeTransform.x, badgeTransform.y);
- badgeText.setTransform(badgeTransform.x, badgeTransform.y);
-
- },
- "_showDownBadge": function(){
- this.view("deviceDownBadgeBg").set("visible", true);
- this.view("deviceDownBadgeText").set("visible", true);
- },
- "_hideDownBadge": function(){
- this.view("deviceDownBadgeBg").set("visible", false);
- this.view("deviceDownBadgeText").set("visible", false);
- }
- }
- });
- }
-
- /**
- * Extend base nx link class function
- */
- function extendLinkClass () {
- nx.define('ExtendedLink', nx.graphic.Topology.Link, {
- view: function(view){
- view.content.push({
- name: 'badge',
- type: 'nx.graphic.Group',
- content: [
- {
- name: 'badgeBg',
- type: 'nx.graphic.Rect',
- props: {
- 'class': 'link-set-circle',
- height: 1
- }
- },
- {
- name: 'badgeText',
- type: 'nx.graphic.Text',
- props: {
- 'class': 'link-set-text',
- y: 1
- }
- }
- ]
- });
- return view;
- },
- properties: {
- stageScale: {
- set: function (a) {
- this.view("badge").setTransform(null, null, a);
- var b = (this._width || 1) * a;
- this.view("line").dom().setStyle("stroke-width", b);
- this.view("path").dom().setStyle("stroke-width", b);
- this._stageScale = a;
- this.update();
- }
- }
- },
- methods: {
- // inherit properties/parent's data
- init: function(args){
- this.inherited(args);
- this.topology().fit();
- },
- // inherit parent's model
- 'setModel': function(model) {
- this.inherited(model);
- //if(model._data.linksIntegrity){
- // this.view('statusIcon').set('src', 'assets/images/attention.png');
- //}
- },
- // when topology's updated
- update: function(){
- /*
- this.inherited();
-
- // ECMP badge settings
- var badge = this.view('badge');
- var badgeText = this.view('badgeText');
- var badgeBg = this.view('badgeBg');
- var statusIcon = this.view('statusIcon');
- var status = this.model()._data.status;
- ECMP, not needed here
- if( this.model()._data.gLinks.length > 2 ) {
- badgeText.sets({
- text: status.operational + '/' + status.configured,
- visible: true
- });
- var bound = badge.getBound();
- var boundMax = Math.max(bound.width - 6, 1);
- badgeBg.sets({width: boundMax, visible: true});
- badgeBg.setTransform(boundMax / -2);
- var centerPoint = this.centerPoint();
- badge.setTransform(centerPoint.x, centerPoint.y);
- }
- // record source & target 'node-id's
- var sourceNode = this.model().source()._data;
- this.model()._data.sourceName = this.model().source()._data.label;
- this.model()._data.targetName = this.model().target()._data.label;
-
- this.view("badge").visible(true);
- this.view("badgeBg").visible(true);
- this.view("badgeText").visible(true);
-
- //set correct link color
- this.set('color',this.getColor());
- */
-
- this.setProviderStyleLine();
- this.set('color', this.getColor());
- },
- // generate the color for a link
- getColor: function(){
- // get color depend on status
- var color = this.model()._data.type === 'chain' ? '#3366ff' : '#009900';
- // make it available outside next
- this.model()._data.linkColor = color;
- return color;
- },
-
- setProviderStyleLine: function() {
- var _offset = this.getOffset();
- var offset = new nx.geometry.Vector(0, _offset);
- var stageScale = this.stageScale();
- var line = this.reverse() ? this.line().negate() : this.line();
- var lineEl = this.view('line');
- var newLine = line.translate(offset).pad(25 * stageScale, 17 * stageScale);
- lineEl.sets({
- x1: newLine.start.x,
- y1: newLine.start.y,
- x2: newLine.end.x,
- y2: newLine.end.y
- });
- lineEl.setStyle('marker-start', 'url(#circle)');
- }
- }
- });
- }
-
- /**
- * Extended class for tooltip nx component
- */
- function extendedTooltip(){
- nx.define('ExtendedTooltip', nx.ui.Component, {
- properties: {
- node: {},
- topology: {}
- },
- view: NextTopologyService.getTooltipContent()
- });
-
- }
-
- /**
- * Define custom events for topology componets
- */
- function defineCustomEvents(){
- nx.define('CustomEvents', nx.graphic.Topology.DefaultScene, {
- methods: {
- clickNode: function(sender, node){
- if ( scope.cbkFunctions.clickNode ) {
- scope.cbkFunctions.clickNode(node);
- }
- },
- clickLink: function(sender, link){
- if ( scope.cbkFunctions.clickLink ) {
- scope.cbkFunctions.clickLink(link);
- }
- }
- }
-
- });
- }
-
- // TODO: remove when come to decision about depiction of node status
- ///**
- // * Creating new node status layer - circles representing device status - up, down
- // */
- //function createNodeStatusLayer(){
- // nx.define("NodeStatus", nx.graphic.Topology.Layer, {
- // nx.define("NodeStatus", nx.graphic.Topology.Layer, {
- // methods: {
- // draw: function() {
- // var topo = this.topology();
- // topo.eachNode(function(node) {
- // var nodeStatus = node._model._data.status === 'operational' ? node._model._data.status : 'down',
- // //type = node._model._data.type,
- // dot = new nx.graphic.Circle({
- // r: 6,
- // cx: -30,
- // cy: -0
- // });
- //
- // dot.set("fill", topoColors.getItem(nodeStatus));
- // dot.attach(node);
- // node.dot = dot;
- // }, this);
- // }
- // }
- // });
- //}
-
- }
- };
- };
-
- NextTopology.$inject=['NextTopologyService'];
-
- return NextTopology;
-});
+++ /dev/null
-var controllers = [
-
-];
-
-var services = [
- 'app/gbp/common/topology/next_topology.service'
-];
-
-var models = [
-
-];
-
-var directives = [
- 'app/gbp/common/topology/next_topology.directive'
-];
-
-define(['angular'].concat(controllers).concat(services).concat(models).concat(directives),
-
- function(angular, NextTopologyService, NextTopology ) {
- 'use strict';
-
- angular
- .module('app.nextTopo', [])
- .config(config);
-
- function config() {
-
- }
-
- angular.module('app.nextTopo')
- .service('NextTopologyService', NextTopologyService)
- .directive('nextTopology', NextTopology);
-
-});
+++ /dev/null
-define(['next-ui'], function () {
- 'use strict';
-
- /**
- * Service to handle next directive
- */
- function NextTopologyService() {
- /**
- * Create base nx topology object
- * @param nx
- * @returns {nx.graphic.Topology}
- */
- this.getNxTopClass = function (topoColors) {
- return new nx.graphic.Topology({
- adaptive: true,
- scalable: true,
- nodeConfig: {
- label: 'model.label',
- //iconType: 'model.icon',
- iconType: 'unlinked',
- color: function (node, model) {
- return topoColors.getItem('forwarding-box');
- }
- },
- linkConfig: {
- // connected to hosts links have different colors
- width: function (model, link) {
- return (model._data.gLinks && model._data.gLinks.length > 2) ? 5 : 3;
- },
- linkType: 'curve'
- },
- tooltipManagerConfig: {
- nodeTooltipContentClass: 'ExtendedTooltip',
- showLinkTooltip: false
- },
- dataProcessor: 'force',
- identityKey: 'id',
- showIcon: true,
- theme: 'blue',
- enableSmartNode: false,
- linkInstanceClass: 'ExtendedLink',
- nodeInstanceClass: 'ExtendedNode'
- });
- };
-
- /**
- * Method for getting right link's color based on status
- * @param status
- * @param topoColors
- * @returns {*}
- */
- this.getLinkColor = function (status, topoColors) {
- var color = null;
-
- if ( status ) {
- // all links are operational
- if ( status.operational === status.configured ) {
- color = topoColors.getItem('operational');
- } else {
- // operational less than configured
- if (status.operational < status.configured && status.operational) {
- color = topoColors.getItem('operational-mixed');
- } else {
- // if operational and something else presented
- if (!status.operational && status.configured) {
- // if the link is between forwarding boxes, it's considered down
- /*if ( model.source()._data.type === 'forwarding-box' && model.target()._data.type === 'forwarding-box' ) {
- color = topoColors.getItem('down');
- } else {
- // otherwise just configured connection
- color = topoColors.getItem('configured');
- }*/
-
- color = topoColors.getItem('down');
- // otherwise
- } else {
- color = topoColors.getItem('default');
- }
- }
- }
-
- } else {
- color = topoColors.getItem('default');
- }
-
- return color;
- };
-
- /**
- * Service for reading topo nodes data from local storage
- * @returns {*}
- */
- this.readTopologyDataFromLS = function(){
- var data = null;
-
- try {
- data = JSON.parse(localStorage.getItem("verizonTopologyData"));
- } catch(e) {
- console.info('Local Storage read parse error:', e);
- }
-
- return data;
- };
-
- /**
- * Set loaded nodes data from local storage
- * @param data
- * @param topo
- * @param nodesDict
- */
- this.setTopologyDataFromLS = function (data, topo, nodesDict) {
- if ( data && data.nodes ) {
-
- data.nodes.forEach(function(node, index){
- var nodeInst = topo.getNode(nodesDict.getItem(node.nodeName));
- if(nodeInst !== undefined)
- nodeInst.position({'x': node.x, 'y': node.y});
- });
- }
- };
-
- /**
- * Prepare and save data to local storage
- * @param topo
- */
- this.saveTopologyDataToLS = function (topo) {
- var data = {'nodes': []},
- nodesLayer = topo.getLayer('nodes');
-
- // prepare data for writing
- nodesLayer.eachNode(function(node){
- data.nodes.push({
- 'x': node.x(),
- 'y': node.y(),
- 'nodeName': node.model()._data['node-id']
- });
- });
-
- // save to local storage
- try {
- localStorage.setItem("verizonTopologyData", JSON.stringify(data));
- } catch(e) {
- console.info('Local Storage save error:', e);
- }
- };
-
- /**
- * Service for fade out all topo layers
- * @param topo
- */
- this.fadeOutAllLayers = function(topo){
- nx.each(topo.layers(), function(layer) {
- layer.fadeOut(true);
- }, this);
- };
-
- /**
- * Service for fade in all topo layers
- * @param topo
- */
- this.fadeInAllLayers = function(topo){
- //fade out all layers
- var linksLayerHighlightElements = topo.getLayer('links').highlightedElements(),
- nodeLayerHighlightElements = topo.getLayer('nodes').highlightedElements();
-
- //Clears previous
- nodeLayerHighlightElements.clear();
- linksLayerHighlightElements.clear();
-
- nx.each(topo.layers(), function(layer) {
- layer.fadeIn(true);
- }, this);
- };
-
- /**
- * Service for highlighting node with(without) links
- * @param topo
- * @param targetId
- * @param noLinks
- */
- this.highlightNode = function (topo, targetId, noLinks) {
- var nodeLayer = topo.getLayer('nodes'),
- linksLayer = topo.getLayer('links'),
- linksLayerHighlightElements = linksLayer.highlightedElements(),
- nodeLayerHighlightElements = nodeLayer.highlightedElements();
-
- //Clears previous
- nodeLayerHighlightElements.clear();
- linksLayerHighlightElements.clear();
-
- //Highlight node
- nodeLayerHighlightElements.add(topo.getNode(targetId));
- if(!noLinks) {
- //highlight links
- linksLayerHighlightElements.addRange(nx.util.values(topo.getNode(targetId).links()));
- }
- else{
- linksLayer.fadeOut(true);
- }
- };
-
- /**
- * Service for highlighting link
- * @param topo
- * @param linkId
- */
- this.highlightLink = function(topo, linkId) {
- var nodeLayer = topo.getLayer('nodes'),
- linksLayer = topo.getLayer('links'),
- linksLayerHighlightElements = linksLayer.highlightedElements(),
- nodeLayerHighlightElements = nodeLayer.highlightedElements(),
- link = topo.getLink(linkId);
-
- //Clears previous
- nodeLayerHighlightElements.clear();
- linksLayerHighlightElements.clear();
-
- //highlight link
- linksLayerHighlightElements.add(link);
- //highlight connected nodes
- nodeLayerHighlightElements.addRange(nx.util.values({source: topo.getNode(link.model().sourceID()), target: topo.getNode(link.model().targetID())}));
- };
-
- /**
- * Service for highlighting selected links path
- * @param topo
- * @param links - array of nx links obj
- */
- this.highlightPath = function(topo, links){
- // clear the path layer and get its instance
- var pathLayer = this.clearPathLayer(topo),
- // define a path
- path = new nx.graphic.Topology.Path({
- 'pathWidth': 5,
- 'links': links,
- 'arrow': 'cap'
- });
-
- // add the path
- pathLayer.addPath(path);
- };
-
- /**
- * Completely clear all paths from path layer
- * @param topo
- * @returns {*} path instance
- */
- this.clearPathLayer = function(topo){
- var pathLayer = topo.getLayer("paths");
- pathLayer.clear();
- return pathLayer;
- };
-
- /**
- * Service for returning nx tooltip skeleton
- * @returns {{content: *[]}}
- */
- this.getTooltipContent = function () {
- return {
- content: [
- {
- tag: "div",
- props: {
- class: "n-topology-tooltip-header"
- },
- content: [
- {
- tag: 'span',
- props: {
- class: "n-topology-tooltip-header-text"
- },
- content: '{#node.model.label}'
- }
- ]
- },
- {
- tag: "div",
- props: {
- class: "n-topology-tooltip-content n-list"
- },
- content: [
- {
- tag: 'ul',
- props: {
- class: "n-list-wrap",
- style: "font-size: 0.8em"
- },
- content: [
- {
- tag: 'li',
- props: {
- class: "n-list-item-i",
- role: "listitem"
- },
- content: [
- {
- tag: "label",
- content: "Status",
- props: {
- style: "display: block; margin-top: 10px;"
- }
- },
- {
- tag: "span",
- content: "{#node.model.status}"
- }
- ]
- },
- {
- tag: 'li',
- props: {
- class: "n-list-item-i",
- role: "listitem"
- },
- content: [
- {
- tag: "label",
- content: "DataPath ID",
- props: {
- style: "display: block; margin-top: 10px;"
- }
- },
- {
- tag: "span",
- content: "{#node.model.datapath-id}"
- }
- ]
- },
- {
- tag: 'li',
- props: {
- class: "n-list-item-i",
- role: "listitem"
- },
- content: [
- {
- tag: "label",
- content: "Type",
- props: {
- style: "display: block; margin-top: 10px;"
- }
- },
- {
- tag: "span",
- content: "{#node.model.data.type}"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- };
- };
- }
-
- NextTopologyService.$inject=[];
-
- return NextTopologyService;
-
-});
+++ /dev/null
-<div layout="row" class="gbpUiWrapper" flex>
- <div layout="column" role="main" flex class="master-view">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <!--<md-button ng-href="#/gbp/index/tenant" ng-click="closeSidePanel()" class="md-primary">Tenant</md-button>
- <md-menu class="md-primary" class="md-toolbar-tools" style="background-color:rgb(33,150,243);color:black;">
- <md-button ng-click="$mdOpenMenu($event)" style="background-color:rgb(33,150,243);color:black;">Policy</md-button>
- <md-menu-content style="background-color:rgb(33,150,243);color:black;">
- <md-button ng-click="" ng-disabled="policyDisabled" ng-href="#/gbp/index/policy/epg" style="background-color:rgb(33,150,243);color:black;">EPGs</md-button>
- <md-button ng-click="" ng-disabled="policyDisabled" ng-href="#/gbp/index/policy/contract" style="background-color:rgb(33,150,243);color:black;">Contracts</md-button>
- </md-menu-content>
- </md-menu>-->
- <md-button ng-click="closeSidePanel()" ng-href="#/gbp/index/resolved-policy">Resolved Policy</md-button>
- <md-button ng-click="closeSidePanel()" ng-href="#/gbp/index/endpoints">Endpoints</md-button>
- <span flex></span>
- <md-button ng-if="('main.gbp.index.resolvedPolicy' | isState) && rootTenant" ng-click="openSidePanel('resolved-policy/sidepanel/views/epg-list-sidepanel')" ng-href="">Endpoint-groups</md-button>
- <md-button ng-if="('main.gbp.index.resolvedPolicy' | isState) && rootTenant" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" ng-href="">Contracts</md-button>
- <md-input-container style="margin-right: 10px;">
- <md-select ng-model="rootTenant"
- placeholder="select tenant"
- md-on-close="setRootTenant();"
- id="tenantSelector">
- <md-option ng-repeat="tenant in rootTenants.data" ng-value="tenant.data.id">{{ tenant.data.id }}</md-option>
- </md-select>
- </md-input-container>
- </div>
- </md-toolbar>
- <!-- <md-content md-scroll-y flex ui-view></md-content> -->
- <md-content md-scroll-y flex ui-view>
- <md-content md-scroll-y flex ui-view="main_top" class="col-md-6"></md-content>
- <md-content md-scroll-y flex ui-view="main_bottom" class="col-md-6"></md-content>
- </md-content>
- </div>
- <!-- Node's side pannel -->
- <md-sidenav class="md-sidenav-right md-whiteframe-z1 detail-view" md-is-locked-open="sidePanelPage">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <h2>
- <span>Sidepanel</span>
- </h2>
- <span flex></span>
- <md-button ng-click="closeSidePanel()" class="md-button">Close panel</md-button>
- </div>
- </md-toolbar>
- <md-content flex>
- <div flex layout="column" ui-view="sidePanel">
- <ng-include ng-if="sidePanelPage" src="viewPath + sidePanelPage + '.tpl.html'"></ng-include>
- </div>
- </md-content>
- </md-sidenav>
-</div>
+++ /dev/null
-<div class="main" ui-view layout="row" flex></div>
+++ /dev/null
-define([
- 'app/gbp/contract/contract.service'
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('AddContractController', AddContractController);
-
- AddContractController.$inject = ['$mdDialog', '$scope', 'ContractService', 'contract'];
- /* @ngInject */
- function AddContractController($mdDialog, $scope, ContractService, contract) {
- /* properties */
- $scope.contract = contract ? contract : ContractService.createObject();
-
- /* methods */
- $scope.closeDialog = closeDialog;
- $scope.save = save;
- /* Implementations */
-
- function closeDialog(){
- $mdDialog.cancel();
- $scope.getContractList();
- }
-
- function save() {
- $scope.contract.put($scope.rootTenant.data.id, function (data) {
- $scope.closeDialog();
- }, function (err) {
- } );
- }
-
- }
-});
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('ContractListService', ContractListService);
-
- ContractListService.$inject = ['Restangular', 'ContractService'];
-
- function ContractListService(Restangular, ContractService) {
- /* methods */
- this.createList = createList;
-
- function ContractList() {
- /* properties */
- this.data = [];
-
- /* methods */
- this.setData = setData;
- this.get = get;
- this.clearData = clearData;
-
- /* Implementation */
- /**
- * fills ContractList object with data
- * @param data
- */
- function setData(data) {
- var self = this;
- data.forEach(function (dataElement) {
- self.data.push(ContractService.createObject(dataElement));
- });
- }
-
- function clearData() {
- var self = this;
- self.data = [];
- }
-
- function get(dataStore, tenantId) {
- /* jshint validthis:true */
- var self = this;
-
- var restObj = Restangular.one('restconf').one(dataStore).one('policy:tenants')
- .one('tenant').one(tenantId).one('policy');
-
- return restObj.get().then(function (data) {
- self.setData(data.policy.contract);
- });
- }
- }
-
- function createList() {
- var obj = new ContractList();
-
- return obj;
- }
- }
-
- return ContractListService;
-});
+++ /dev/null
-define([
- 'app/gbp/contract/contract.service',
- 'app/gbp/contract/contract-list.service',
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('ContractController', ContractController);
-
- ContractController.$inject = ['$mdDialog', '$scope', 'TenantListService', 'TenantService', 'ContractService', 'ContractListService', '$stateParams'];
-
- function ContractController($mdDialog, $scope, TenantListService, TenantService, ContractService, ContractListService, $stateParams) {
- $scope.contracts = ContractListService.createList();
- $scope.openContractDialog = openContractDialog;
- $scope.contractsTableQuery = {
- order: 'data.id',
- limit: 25,
- page: 1,
- options: [25, 50, 100],
- filter: '',
- };
- $scope.getContractList = getContractList;
- $scope.deleteContractDialog = deleteContractDialog;
-
- getContractList();
-
- function getContractList() {
- $scope.contracts.clearData();
- $scope.contracts.get($scope.rootTenant.data.id);
- }
-
- function openContractDialog(contractData) {
- $mdDialog.show({
- clickOutsideToClose: true,
- controller: 'AddContractController',
- preserveScope: true,
- templateUrl: 'src/app/gbp/contract/dialog-add-contract.tpl.html',
- parent: angular.element(document.body),
- scope: $scope,
- locals: {
- contract: contractData,
- },
- });
- }
-
- function deleteContractDialog(contractData) {
- var confirm = $mdDialog.confirm()
- .title('Delete contract')
- .textContent('Do you want to delete contract ' + contractData.data.id + '?')
- .ok('Delete')
- .cancel('Cancel');
-
- $mdDialog.show(confirm).then(function () {
- contractData.deleteContract($scope.rootTenant.data.id,
- function () {
- $scope.getContractList();
- }
- );
- }, function () {
-
- });
- }
-
- $scope.$on('ROOT_TENANT_CHANGED', getContractList);
- }
-});
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('ContractService', ContractService);
-
- ContractService.$inject = ['Restangular'];
-
- function ContractService(Restangular) {
- /* methods */
- this.createObject = createObject;
-
- /**
- * Contract constructor
- * @constructor
- */
- function Contract() {
- /* properties */
- this.data = {};
- /* methods */
- this.setData = setData;
- this.get = get;
- this.put = put;
- this.deleteContract = deleteContract;
-
- /* Implementation */
- /**
- * fills Contract object with data
- * @param data
- */
- function setData(data) {
- this.data.id = data.id;
- this.data.description = data.description;
- this.data.parent = data.parent;
-
- // TODO: use objects
- this.data['forwarding-context'] = data['forwarding-context'];
- this.data.target = data.target;
- this.data.subject = data.subject;
- this.data.clause = data.clause;
- this.data.quality = data.quality;
- }
-
- /**
- * gets one Contract object from Restconf
- * @param id
- * @returns {*}
- */
- function get(idContract, idTenant, apiType) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one(apiType).one('policy:tenants')
- .one('tenant').one(idTenant).one('policy').one('contract').one(idContract);
-
- return restObj.get().then(function (data) {
- self.setData(data.contract[0]);
- });
- }
-
- function put(id, successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(id).one('policy').one('contract').one(self.data.id),
- dataObj = { contract: [self.data] };
-
- return restObj.customPUT(dataObj).then(function (data) {
- successCallback(data);
- }, function (res) {
-
- });
- }
-
- function deleteContract(id, successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(id).one('policy').one('contract').one(self.data.id);
-
- return restObj.remove().then(function (data) {
- successCallback(data);
- }, function (res) {
-
- });
- }
-
- }
-
- /**
- * creates Contract object and fills it with data if available
- * @param data
- * @returns {Contract}
- */
- function createObject(data) {
- var obj = new Contract();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return ContractService;
-});
+++ /dev/null
-<section flex layout="column">
- <div flex layout="row">
- <md-button ng-click="openContractDialog()" class="md-primary">Add</md-button>
- <md-button ng-click="getContractList()" class="md-primary">Reload</md-button>
- </div>
- <md-table-container ng-if="contracts.data.length" ng-hide="contractId.length">
- <table md-table>
- <thead md-head md-order="contractsTableQuery.order">
- <tr md-row>
- <th md-column md-order-by="data.id"><span>Id</span></th>
- <th md-column md-order-by="data.parent"><span>Parent</span></th>
- <th md-column md-order-by="data.description"><span>Description</span></th>
- <th md-column><span>Actions</span></th>
- </tr>
- </thead>
- <tbody md-body>
- <tr md-row ng-repeat="contract in contracts.data | filter: contractsTableQuery.filter | orderBy : contractsTableQuery.order | limitTo: contractsTableQuery.limit : (contractsTableQuery.page -1) * contractsTableQuery.limit">
- <td md-cell>{{contract.data.id}}</td>
- <td md-cell>{{contract.data.parent}}</td>
- <td md-cell>{{contract.data.description}}</td>
- <td md-cell>
- <md-button class="md-icon-button" ng-click="openContractDialog(contract)">
- <md-icon>edit</md-icon>
- </md-button>
- <md-button class="md-icon-button" ng-click="deleteContractDialog(contract)">
- <md-icon>delete</md-icon>
- </md-button>
- </td>
- </tr>
-
- </tbody>
- </table>
- <md-table-pagination md-limit="contractsTableQuery.limit"
- md-page="contractsTableQuery.page"
- md-options="contractsTableQuery.options"
- md-total="{{contracts.data.length}}"
- md-page-select="options.pageSelect">
- </md-table-pagination>
- </md-table-container>
-
- <section ng-if="contractId.length">
- Details of contract: <u>{{contract1}}</u><br /><br />
- <u>contract1:</u><br />
- id: {{contract.data.id}}<br />
- description: {{contract.data.description}}<br />
- parent:{{contract.data.parent}}<br />
- his containers:</b><br />
- <u>Target object:</u><br />{{contract.data.target}}
- <u>Subject object:</u><br />{{contract.data.subject}}
- <u>Clause object:</u><br />{{contract.data.clause}}
- <u>Quality object:</u><br />{{contract.data.quality}}
- </section>
-
-</section>
+++ /dev/null
-<md-dialog ng-cloak class="gbpDialogWrapper">
- <form name="contractForm">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <h2>contract</h2>
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-button">Close dialog</md-button>
- </div>
- </md-toolbar>
- <md-dialog-content style="width:350px;">
- <div layout="column" class="layout-padding-lr15">
- <div layout="row">
- <md-input-container flex>
- <label>Id</label>
- <input name="id" ng-model="contract.data.id" ng-required="true">
- <div ng-messages="contractForm.id.$error">
- <div ng-message="required">Required field</div>
- </div>
- </md-input-container>
- <md-input-container flex>
- <label>Parent</label>
- <input name="parent" ng-model="contract.data.parent" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\\-_.])*$/" ng-required="true">
- <div ng-messages="contractForm.parent.$error">
- <div ng-message="required">Required field.</div>
- <div ng-message="pattern">
- Invalid pattern.
- <md-tooltip md-direction="right" style="padding-left: 10px;">Value must match: ^[a-zA-Z]([a-zA-Z0-9\\-_.])*$</md-tooltip>
- </div>
- </div>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Description</label>
- <input name="description" ng-model="contract.data.description">
- </md-input-container>
- </div>
- </div>
- </md-dialog-content>
- <md-dialog-actions layout="row">
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-primary">
- Close
- </md-button>
- <md-button ng-click="save()" style="margin-right:20px;" ng-disabled="contractForm.$invalid" class="md-primary">
- Save
- </md-button>
- </md-dialog-actions>
- </form>
-</md-dialog>
+++ /dev/null
-define([
- 'app/gbp/endpoints/endpoint.service',
- 'app/gbp/forwarding/forwarding.service',
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('AddEndpointController', AddEndpointController);
-
- AddEndpointController.$inject = ['$state', '$filter', '$mdDialog', '$scope', 'EndpointService', 'endpoint', 'ForwardingService'];
- /* @ngInject */
- function AddEndpointController($state, $filter, $mdDialog, $scope, EndpointService, endpoint, ForwardingService) {
- /* properties */
-
- $scope.endpoint = endpoint ? endpoint : EndpointService.createObject();
- if (!$scope.endpoint.data.tenant) {
- $scope.endpoint.data.tenant = $scope.rootTenant ? $scope.rootTenant : null;
- }
- $scope.epgsChips = {
- selectedItem: null,
- searchText: null,
- };
- $scope.epgsListOfChoosenTenant = [];
- $scope.forwarding = ForwardingService.createObject();
- $scope.forwardingContexts = [];
- $scope.forwardingNetworkDomainIds = [];
- $scope.regexps = {
- 'ipv4cidr': '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))',
- 'ipv6cidr': 's*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))',
- 'mac-address': '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})',
- };
-
- $scope.regexps['ip-prefix'] = '(('+$scope.regexps.ipv4cidr + ')|(' + $scope.regexps.ipv6cidr + '))';
-
- /* methods */
- $scope.closeDialog = closeDialog;
- $scope.save = save;
- $scope.filterContextIds = filterContextIds;
- $scope.filterNetworkDomainIds = filterNetworkDomainIds;
- $scope.searchEpgs = searchEpgs;
- $scope.populateScopeAfterTenantSelected = populateScopeAfterTenantSelected;
-
- populateScopeAfterTenantSelected();
-
- /* Implementations */
- $scope.forwarding.get(postForwardingGet);
-
- function closeDialog(){
- $mdDialog.cancel();
- if($state.current.name == 'main.gbp.index.endpoints')
- $scope.getEndpointsList();
- }
-
- function save() {
- if ($scope.endpoint.data['network-containment'] && $scope.endpoint.data['network-containment']['network-domain-id']) {
- $scope.endpoint.data['network-containment']['network-domain-type'] = 'l2-l3-forwarding:subnet';
- }
- else {
- delete $scope.endpoint.data['network-containment'];
- }
- $scope.endpoint.post(function () {
- $scope.closeDialog();
- $scope.broadcastFromRoot('endpointChanged');
- }, function () {
- } );
- }
-
- function filterContextIds(contextType) {
- $scope.forwardingContexts = $filter('filter')($scope.forwarding.data['forwarding-context'], {'context-type': contextType});
- }
-
- function filterNetworkDomainIds(networkDomainType) {
- $scope.forwardingNetworkDomainIds = $filter('filter')($scope.forwarding.data['network-domain'], {'network-domain-type': networkDomainType});
- }
-
- function populateEpgsListOfChoosenTenant() {
- $scope.rootTenants.data.some(function (tenant) {
- if (tenant.data.id === $scope.endpoint.data.tenant) {
- $scope.epgsListOfChoosenTenant = tenant.data.policy['endpoint-group'].map(function (ele) { return ele.id; } );
- }
- });
- }
-
- function searchEpgs(query) {
- var self = this,
- results = query ? self.epgsListOfChoosenTenant.filter(createFilterFor(query) ) : self.epgsListOfChoosenTenant;
- return results;
- }
-
- function createFilterFor(query) {
- return function filterFn(epg) {
- return (epg.toLowerCase().indexOf(query.toLowerCase()) === 0);
- };
- }
-
- function postForwardingGet() {
- var tenantForwarding = $filter('filter')($scope.forwarding.data, { 'tenant-id': $scope.endpoint.data.tenant });
-
- if (tenantForwarding && tenantForwarding.length) {
- $scope.forwarding.data = tenantForwarding[0];
- $scope.filterNetworkDomainIds('l2-l3-forwarding:subnet');
- }
-
- if ($scope.endpoint && $scope.endpoint.data['context-type']) {
- $scope.filterContextIds($scope.endpoint.data['context-type']);
- }
- }
-
- function populateScopeAfterTenantSelected() {
- populateEpgsListOfChoosenTenant();
- }
-
- }
-});
+++ /dev/null
-<md-dialog ng-cloak class="gbpDialogWrapper">
- <form name="endpointForm">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <h2>Add Endpoint</h2>
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-button">Close dialog</md-button>
- </div>
- </md-toolbar>
- <md-dialog-content style="width:800px;">
- <md-tabs md-dynamic-height flex>
- <md-tab label="Endpoint">
- <div layout="column" class="layout-padding-lr15">
- <div layout="row">
- <md-input-container flex >
- <label>Tenant Id</label>
- <md-select ng-model="endpoint.data.tenant" md-on-close="populateScopeAfterTenantSelected();" aria-label="Tenant select">
- <md-option ng-repeat="tenant in rootTenants.data" ng-value="tenant.data.id">{{ tenant.data.id }}</md-option>
- </md-select>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Context Type</label>
- <md-select name="contextTypeSelect" ng-model="endpoint.data['context-type']"
- ng-change="filterContextIds(endpoint.data['context-type'])"
- aria-label="Context type select"
- ng-required="true">
- <md-option ng-repeat="contextType in ['l2-l3-forwarding:l2-bridge-domain', 'l2-l3-forwarding:l2-flood-domain', 'l2-l3-forwarding:l3-context']"
- ng-value="contextType">
- {{ contextType }}
- </md-option>
- </md-select>
- <div ng-messages="endpointForm.contextTypeSelect.$error" ng-show="endpointForm.contextTypeSelect.$touched">
- <div ng-message="required">Required field</div>
- </div>
- </md-input-container>
- <md-input-container flex ng-if="forwardingContexts.length">
- <label>Context Id</label>
- <md-select name="contextIdSelect" ng-model="endpoint.data['context-id']"
- aria-label="Context Id select"
- ng-required="true">
- <md-option ng-repeat="contextId in forwardingContexts"
- ng-value="contextId['context-id']">
- {{ contextId['context-id'] }}
- </md-option>
- </md-select>
- <div ng-messages="endpointForm.contextIdSelect.$error" ng-show="endpointForm.contextIdSelect.$touched">
- <div ng-message="required">Required field</div>
- </div>
- </md-input-container>
- <md-input-container flex ng-if="!forwardingContexts.length">
- <label>Context Id</label>
- <input ng-model="endpoint.data['context-id']" />
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Address Type</label>
- <md-select name="AddressType" ng-model="endpoint.data['address-type']" aria-label="Address Type select" ng-required="true">
- <md-option ng-repeat="addressType in ['l2-l3-forwarding:mac-address-type', 'l2-l3-forwarding:ip-prefix-type']"
- ng-value="addressType">
- {{ addressType }}
- </md-option>
- </md-select>
- <div ng-messages="endpointForm.AddressType.$error" ng-show="endpointForm.AddressType.$touched">
- <div ng-message="required">Required field</div>
- </div>
- </md-input-container>
- <md-input-container flex>
- <label>Address</label>
- <input name="address" ng-model="endpoint.data.address" ng-required="true"
- ng-pattern="(endpoint.data['address-type'] === 'l2-l3-forwarding:mac-address-type' ? regexps['mac-address'] : regexps['ip-prefix'])">
- <div ng-messages="endpointForm.address.$error" ng-show="endpointForm.address.$touched">
- <div ng-message="required">Required field</div>
- <div ng-message="pattern">Expected correct address type format</div>
- </div>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex ng-if="forwardingNetworkDomainIds.length">
- <label>Network Containment - Network Domain Id</label>
- <md-select name="networkDomainIdSelect"
- ng-model="endpoint.data['network-containment']['network-domain-id']"
- aria-label="Network Domain Id select">
- <md-option value="{{undefined}}"></md-option>
- <md-option ng-repeat="NetworkDomainId in forwardingNetworkDomainIds"
- ng-value="NetworkDomainId['network-domain-id']"
- ng-required="true" >
- {{ NetworkDomainId['network-domain-id'] }}
- </md-option>
- </md-select>
- </md-input-container>
- <md-input-container flex ng-if="!forwardingNetworkDomainIds.length">
- <label>Network Containment - Network Domain Id</label>
- <input name="networkDomainIdInput" ng-model="endpoint.data['network-containment']['network-domain-id']"/>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Endpoint Group</label>
- <md-chips
- name="epgs"
- ng-model="endpoint.data['endpoint-group']"
- md-autocomplete-snap
- flex>
- <md-autocomplete
- md-selected-item="epgsChips.selectedItem"
- md-search-text="epgsChips.searchText"
- md-items="epg in searchEpgs(epgsChips.searchText)"
- md-item-text="epg"
- placeholder="{{!endpoint.data.tenant ? 'Select Tenant first' : 'Add an item'}}"
- md-autocomplete-wrap-override
- md-input-name="epAutocomplete"
- flex
- ng-disabled="!endpoint.data.tenant">
- <md-item-template>
- <span md-highlight-text="epgsChips.searchText">{{epg}}</span>
- </md-item-template>
- <md-not-found>
- No matches found.
- </md-not-found>
- </md-autocomplete>
- <md-chip-template>
- <span>{{$chip}}</span>
- </md-chip-template>
- </md-chips>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Condition</label>
- <md-chips ng-model="endpoint.data.condition"
- placeholder="Add an item">
- </md-chips>
- </md-input-container>
- </div>
- </div>
- </md-tab>
- <md-tab label="Location">
- <div layout="column" class="layout-padding-lr15">
- <md-subheader class="md-primary">Absolute location</md-subheader>
- <div layout="row">
- <md-input-container flex>
- <label>Internal node</label>
- <input name="AbsoluteLocationInternalNode" ng-model="endpoint.data['absolute-location']['internal-node']">
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Internal node connector</label>
- <input name="AbsoluteLocationInternalNodeConnector" ng-model="endpoint.data['absolute-location']['internal-node-connector']">
- </md-input-container>
- </div>
- </div>
- </md-tab>
- </md-tabs>
- </md-dialog-content>
- <md-dialog-actions layout="row">
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-primary">
- Close
- </md-button>
- <md-button ng-click="save()" style="margin-right:20px;" ng-disabled="endpointForm.$invalid" class="md-primary">
- Save
- </md-button>
- </md-dialog-actions>
- </form>
-</md-dialog>
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('EndpointService', EndpointService);
-
- EndpointService.$inject = ['Restangular'];
-
- function EndpointService(Restangular) {
- /* methods */
- this.createObject = createObject;
-
- /**
- * Endpoint constructor
- * @constructor
- */
- function Endpoint() {
- /* properties */
- this.data = {};
- this.data['endpoint-group'] = [];
- this.data.condition = [];
-
- /* methods */
- this.setData = setData;
- this.post = post;
- this.deleteEndpoint = deleteEndpoint;
- this.getEndpointContextTypeAcronym = getEndpointContextTypeAcronym;
-
- /* Implementation */
-
- function getEndpointContextTypeAcronym() {
- switch(this.data['context-type']) {
- case 'l2-l3-forwarding:l2-bridge-domain':
- return 'L2B';
- case 'l2-l3-forwarding:l2-flood-domain':
- return 'L2F';
- default:
- return 'L3';
- }
- }
- /**
- * fills Endpoint object with data
- * @param data
- */
-
- function setData(data) {
- this.data['context-type'] = data['context-type'];
- this.data['context-id'] = data['context-id'];
- this.data['address-type'] = data['address-type'];
- this.data.address = data.address;
- this.data['network-containment'] = data['network-containment'];
- this.data.tenant = data.tenant;
- this.data['endpoint-group'] = data['endpoint-group'] ? data['endpoint-group'] : [];
- this.data.condition = data.condition ? data.condition : [];
- this.data.timestamp = data.timestamp ? data.timestamp : Date();
- if (this.data['absolute-location']){
- this.data['absolute-location']['internal-node'] = data['absolute-location']['internal-node'];
- this.data['absolute-location']['internal-node-connector'] = data['absolute-location']['internal-node-connector'];
- }
- }
- /**
- * gets one Endpoint object from Restconf
- * @param id
- * @returns {*}
- */
-
- function post(successCbk) {
-
- var self = this,
- restObj = Restangular.one('restconf').one('operations').one('base-endpoint:register-endpoint'),
- reqData = {
- 'input': {
- 'address-endpoint-reg': [
- self.data,
- ],
- },
- };
- restObj.customPOST(reqData).then(function (data) {
- successCbk(data);
- }, function () {
-
- });
- }
-
- function deleteEndpoint(successCallback) {
- var self = this,
- tmpEndpointObject = {
- 'context-type': self.data['context-type'],
- 'context-id': self.data['context-id'],
- 'address': self.data.address,
- 'address-type': self.data['address-type'],
- };
- var restObj = Restangular
- .one('restconf')
- .one('operations')
- .one('base-endpoint:unregister-endpoint'),
- reqData = {
- 'input': {
- 'address-endpoint-unreg': [
- tmpEndpointObject,
- ],
- },
- };
- return restObj.customPOST(reqData).then(function () {
- (successCallback() || angular.noop)();
- }, function () {
-
- });
- }
- }
-
- /**
- * creates Endpoint object and fills it with data if available
- * @param data
- * @returns {Endpoint}
- */
- function createObject(data) {
- var obj = new Endpoint();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return EndpointService;
-});
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('EndpointsListService', EndpointsListService);
-
- EndpointsListService.$inject = ['$filter', 'Restangular', 'EndpointService'];
-
- function EndpointsListService($filter, Restangular, EndpointService) {
- /* methods */
- this.createList = createList;
-
- function EndpointsList() {
- /* properties */
- this.data = [];
-
- /* methods */
- this.setData = setData;
- this.get = get;
- this.getByEpg = getByEpg;
- this.getByTenantId = getByTenantId;
- this.clearData = clearData;
-
- /* Implementation */
- /**
- * fills EndpointsList object with data
- * @param data
- */
- function setData(data) {
- var self = this;
-
- self.clearData();
- data && data.forEach(function (dataElement) {
- self.data.push(EndpointService.createObject(dataElement));
- });
- }
-
- function clearData() {
- var self = this;
- self.data = [];
- }
-
- function get() {
- /* jshint validthis:true */
- var self = this;
- var restObj = Restangular.one('restconf').one('operational').one('base-endpoint:endpoints');
-
- return restObj.get().then(function (data) {
- self.setData(data.endpoints['address-endpoints']['address-endpoint']);
- });
- }
-
- function getByEpg(epg, tenant, successCallback) {
- /* jshint validthis:true */
- var self = this;
- var restObj = Restangular.one('restconf').one('operational').one('base-endpoint:endpoints');
-
- return restObj.get().then(function (data) {
- var endpoints = $filter('filter')(
- data.endpoints['address-endpoints']['address-endpoint'].map(function(endpoint) {
- return endpoint;
- }),
- function (ep) {
- if (ep.tenant === tenant && ep['endpoint-group'].indexOf(epg.id) !== -1) {
- return true;
- }
- }
- );
- self.setData(endpoints);
-
- (successCallback || angular.noop)();
- });
- }
-
- function getByTenantId(rootTenant) {
- var self = this;
- var restObj = Restangular.one('restconf').one('operational').one('base-endpoint:endpoints');
- return restObj.get().then(function (data) {
- var endpoints = $filter('filter')(data.endpoints['address-endpoints']['address-endpoint'].map(function(endpoint) {
- return endpoint;
- }), { 'tenant': rootTenant });
- self.setData(endpoints);
- });
- }
-
- }
-
- function createList() {
- var obj = new EndpointsList();
-
- return obj;
- }
- }
-
- return EndpointsListService;
-});
+++ /dev/null
-define([
- 'app/gbp/endpoints/endpoint.service',
- 'app/gbp/endpoints/endpoints-list.service',
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('EndpointsController', EndpointsController);
-
- EndpointsController.$inject = ['$scope', '$mdDialog', 'EndpointsListService'];
-
- function EndpointsController($scope, $mdDialog, EndpointsListService) {
- /* properties */
- $scope.endpoints = EndpointsListService.createList();
- $scope.disableKeyFieldsEditing = false;
- $scope.endpointsTableQuery = {
- order: "data['context-id']",
- limit: 25,
- page: 1,
- options: [25, 50, 100],
- filter: '',
- };
- /* methods */
- $scope.openEndpointDialog = openEndpointDialog;
- $scope.getEndpointsList = getEndpointsList;
- $scope.deleteEndpointDialog = deleteEndpointDialog;
-
- $scope.getEndpointsList();
-
- function getEndpointsList() {
- $scope.endpoints.clearData();
- $scope.rootTenant ? $scope.endpoints.getByTenantId($scope.rootTenant) : $scope.endpoints.get($scope.rootTenant);
-
- $scope.endpointSgtList.clearData();
- $scope.endpointSgtList.get();
- }
-
- function openEndpointDialog(operation, endpointData) {
- $scope.disableKeyFieldsEditing = operation === 'edit';
- $mdDialog.show({
- clickOutsideToClose: true,
- controller: 'AddEndpointController',
- preserveScope: true,
- templateUrl: $scope.viewPath + 'endpoints/dialog-add-endpoint.tpl.html',
- parent: angular.element(document.body),
- scope: $scope,
- locals: {
- endpoint: endpointData,
- },
- });
- }
-
- function deleteEndpointDialog(endpointData) {
- var confirm = $mdDialog.confirm()
- .title('Delete endpoint')
- .textContent('Do you want to delete endpoint?')
- .ok('Delete')
- .cancel('Cancel');
-
- $mdDialog.show(confirm).then(function () {
- endpointData.deleteEndpoint(function () {
- $scope.getEndpointsList();
- });
- }, function () {
-
- });
- }
-
- $scope.$on('ROOT_TENANT_CHANGED', function () {
- $scope.getEndpointsList();
- });
- }
-});
+++ /dev/null
-<section flex layout="column">
- <div flex layout="row">
- <md-button ng-click="openEndpointDialog('add', null)" class="md-primary">Add</md-button>
- <md-button ng-click="getEndpointsList()" class="md-primary">Reload</md-button>
- </div>
- <md-table-container ng-if="endpoints.data.length">
- <table md-table>
- <thead md-head md-order="endpointsTableQuery.order">
- <tr md-row>
- <th md-column md-order-by="data['context-id']"><span>Context Id</span></th>
- <th md-column md-order-by="data.address"><span>Address</span></th>
- <th md-column md-order-by="data.tenant"><span>Tenant</span></th>
- <th md-column ><span>Endpoint Group</span></th>
- <th md-column><span>Actions</span></th>
- </tr>
- </thead>
- <tbody md-body>
- <tr md-row ng-repeat="endpoint in endpoints.data | filter: endpointsTableQuery.filter | orderBy : endpointsTableQuery.order | limitTo: endpointsTableQuery.limit : (endpointsTableQuery.page -1) * endpointsTableQuery.limit">
- <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint, null);">{{ endpoint.data['context-id'] }}</td>
- <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint, null);">{{ endpoint.data.address }}</td>
- <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint, null);">{{ endpoint.data.tenant }}</td>
- <td md-cell>
- <span ng-repeat="epg in endpoint.data['endpoint-group']">{{epg}}<span ng-if="!$last">, </span>
- </span>
- </td>
- <td md-cell>
- <md-button class="md-icon-button" ng-click="openEndpointDialog('edit', endpoint)">
- <md-icon>edit</md-icon>
- </md-button>
- <md-button class="md-icon-button" ng-click="deleteEndpointDialog(endpoint)">
- <md-icon>delete</md-icon>
- </md-button>
- </td>
- </tr>
- </tbody>
- </table>
- <md-table-pagination md-limit="endpointsTableQuery.limit"
- md-page="endpointsTableQuery.page"
- md-options="endpointsTableQuery.options"
- md-total="{{endpoints.data.length}}"
- md-page-select="options.pageSelect">
- </md-table-pagination>
- </md-table-container>
-</section>
+++ /dev/null
-<md-content>
- <md-subheader class="md-primary">Endpoint properties</md-subheader>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data.tenant.length">
- <span flex="35"><strong>Tenant</strong></span><span flex>{{ sidePanelObject.data.tenant }}</span>
- </div>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['endpoint-group'].length">
- <span flex="35"><strong>Endpoint group</strong></span><span ng-repeat="epg in sidePanelObject.data['endpoint-group']">{{epg}}<span ng-if="!$last">, </span>
- </span>
- </div>
- <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
- <span flex="35"><strong>Context type</strong></span><span flex>{{ sidePanelObject.data['context-type'] }}</span>
- </div>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
- <span flex="35"><strong>Context Id</strong></span><span flex>{{ sidePanelObject.data['context-id'] }}</span>
- </div>
- <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
- <span flex="35"><strong>Address type</strong></span><span flex>{{ sidePanelObject.data['address-type'] }}</span>
- </div>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
- <span flex="35"><strong>Address</strong></span><span flex>{{ sidePanelObject.data.address }}</span>
- </div>
- <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
- <section ng-if="sidePanelObject.data['network-containment']['network-domain-type'].length">
- <md-subheader class="md-secondary" style="color: rgb(33,150,243);">Network domain</md-subheader>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
- <span flex="35"><strong>Id</strong></span><span flex>{{ sidePanelObject.data['network-containment']['network-domain-id'] }}</span>
- </div>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
- <span flex="35"><strong>type</strong></span><span flex>{{ sidePanelObject.data['network-containment']['network-domain-type'] }}</span>
- </div>
- <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
- </section>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data.condition.length">
- <span flex="35"><strong>Condition</strong></span><span ng-repeat="cndt in sidePanelObject.data.condition">{{cndt}}<span ng-if="!$last">, </span>
- </span>
- </div>
- <section ng-if="sidePanelObject.data['absolute-location']['internal-node'].length || sidePanelObject.data['absolute-location']['internal-node-connector'].length">
- <label class=".md-subhead">Absolute Location</label>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['absolute-location']['internal-node']">
- <span flex="35"><strong>Internal node</strong></span><span flex>{{ sidePanelObject.data['absolute-location']['internal-node'] }}</span>
- </div>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['absolute-location']['internal-node-connector']">
- <span flex="35"><strong>Internal node connector</strong></span><span flex>{{ sidePanelObject.data['absolute-location']['internal-node-connector'] }}</span>
- </div>
- </section>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data.timestamp">
- <span flex="35"><strong>Timestamp</strong></span><span flex>{{ sidePanelObject.data.timestamp | date: 'short'}}</span>
- </div>
- <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="endpointSgtList.findSgtsForEndpoint(sidePanelObject).length">
- <span flex="35"><strong>SGT</strong></span><span>{{ endpointSgtList.findSgtsForEndpoint(sidePanelObject) }}</span>
- </div>
-<md-content>
+++ /dev/null
-define(['app/gbp/endpoints/sxp-mapping.service'], function () {
- 'use strict';
-
- angular.module('app.gbp').service('SxpMappingListService', SxpMappingListService);
-
- SxpMappingListService.$inject = ['$filter', 'Restangular', 'SxpMappingService'];
-
- function SxpMappingListService($filter, Restangular, SxpMappingService) {
- /* methods */
- this.createList = createList;
-
- function EndpointsSgtList() {
- /* properties */
- this.data = [];
-
- /* methods */
- this.setData = setData;
- this.get = get;
- this.clearData = clearData;
- this.findSgtsForEndpoint = findSgtsForEndpoint;
-
- /* Implementation */
- /**
- * fills EndpointsSgtList object with data
- * @param data
- */
- function setData(data) {
- var self = this;
-
- data && data.forEach(function (dataElement) {
- self.data.push(SxpMappingService.createObject(dataElement));
- });
- }
-
- function clearData() {
- var self = this;
- self.data = [];
- }
-
- function get() {
- /* jshint validthis:true */
- var self = this;
- var restObj = Restangular.one('restconf').one('config').one('sxp-mapper-model:sxp-mapper');
-
- return restObj.get().then(function (data) {
- self.setData(data['sxp-mapper']['endpoint-policy-template-by-sgt']);
- });
- }
-
- function findSgtsForEndpoint(EPobject) {
- var self = this,
- result = self.data.map(function (ele) {
- // properties correction
- var condition = ele.data.conditions === undefined ? [] : ele.data.conditions,
- epg = ele.data['endpoint-groups'] === undefined ? [] : ele.data['endpoint-groups'];
-
- return condition.length==EPobject.data.condition.length && condition.every(function(v,i) { return ($.inArray(v,EPobject.data.condition) != -1)}) &&
- epg.length==EPobject.data['endpoint-group'].length && epg.every(function(v,i) { return ($.inArray(v,EPobject.data['endpoint-group']) != -1)}) &&
- angular.equals(ele.data.tenant, EPobject.data.tenant) ? ele.data.sgt : false;
- }).filter(Boolean);
- return result.toString();
- }
- }
-
- function createList() {
- var obj = new EndpointsSgtList();
-
- return obj;
- }
- }
-
- return SxpMappingListService;
-});
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('SxpMappingService', SxpMappingService);
-
- function SxpMappingService() {
- /* methods */
- this.createObject = createObject;
-
- /**
- * EndpointSgt constructor
- * @constructor
- */
- function EndpointSgt() {
- /* properties */
- this.data = {};
-
- /* methods */
- this.setData = setData;
-
- /* Implementation */
- /**
- * fills EndpointSgt object with data
- * @param data
- */
-
- function setData(data) {
- this.data = {};
- this.data.sgt = data.sgt;
- this.data['endpoint-groups'] = data['endpoint-groups'];
- this.data.conditions = data.conditions;
- this.data.tenant = data.tenant;
- }
- }
-
- /**
- * creates EndpointSgt object and fills it with data if available
- * @param data
- * @returns {EndpointSgt}
- */
- function createObject(data) {
- var obj = new EndpointSgt();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return SxpMappingService;
-});
+++ /dev/null
-define([
- 'app/gbp/epg/epg.service'
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('AddEpgController', AddEpgController);
-
- AddEpgController.$inject = ['$mdDialog', '$scope', 'EpgService', 'epg'];
- /* @ngInject */
- function AddEpgController($mdDialog, $scope, EpgService, epg) {
- /* properties */
- $scope.epg = epg ? epg : EpgService.createObject();
-
- /* methods */
- $scope.closeDialog = closeDialog;
- $scope.save = save;
-
- /* Implementations */
-
- function closeDialog(){
- $mdDialog.cancel();
- $scope.getEpgList();
- }
-
- function save() {
- $scope.epg.put($scope.rootTenant, function(data) {
- $scope.closeDialog();
- }, function(err) {
- } );
- }
- }
-});
+++ /dev/null
-<md-dialog ng-cloak class="gbpDialogWrapper">
- <form name="epgForm">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <h2>EPG</h2>
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-button">Close dialog</md-button>
- </div>
- </md-toolbar>
- <md-dialog-content style="width:350px;">
- <div layout="column" class="layout-padding-lr15">
- <div layout="row">
- <md-input-container flex>
- <label>Id</label>
- <input name="id" ng-model="epg.data.id" ng-required="true">
- <div ng-messages="epgForm.id.$error" md-auto-hide="false">
- <div ng-message="required">Required field</div>
- </div>
- </md-input-container>
- <md-input-container flex>
- <label>Name</label>
- <input name="name" ng-model="epg.data.name" ng-required="true" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\\-_.])*$/">
- <div ng-messages="epgForm.name.$error" md-auto-hide="false">
- <div ng-message="required">Required field</div>
- <div ng-message="pattern">
- Invalid pattern.
- <md-tooltip md-direction="right" style="padding-left: 10px;">Value must matches: ^[a-zA-Z]([a-zA-Z0-9\\-_.])*$</md-tooltip>
- </div>
- </div>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Description</label>
- <input name="description" ng-model="epg.data.description">
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>intra-group-policy</label>
- <md-select name="intraGroupPolicy" ng-model="epg.data['intra-group-policy']">
- <md-option ng-repeat="igp in ['', 'allow', 'require-contract']" ng-value="igp">{{igp}}</md-option>
- </md-select>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>network-domain</label>
- <input name="networkDomain" ng-model="epg.data['network-domain']">
- </md-input-container>
- <md-input-container flex>
- <label>parent</label>
- <input name="parent" ng-model="epg.data.parent">
- </md-input-container>
- </div>
- </div>
- </md-dialog-content>
- <md-dialog-actions layout="row">
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-primary">
- Close
- </md-button>
- <md-button ng-click="save()" style="margin-right:20px;" ng-disabled="epgForm.$invalid" class="md-primary">
- Save
- </md-button>
- </md-dialog-actions>
- </form>
-</md-dialog>
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').service('EpgListService', EpgListService);
-
- EpgListService.$inject = ['Restangular', 'EpgService'];
-
- function EpgListService(Restangular, EpgService) {
- /* methods */
- this.createList = createList;
-
- function EpgList() {
- /* properties */
- this.data = [];
- /* methods */
- this.setData = setData;
- this.get = get;
-
- /* Implementation */
- /**
- * fills EpgList object with data
- * @param data
- */
- function setData(data) {
- var self = this;
- data.forEach(function(dataElement) {
- self.data.push(EpgService.createObject(dataElement));
- });
- }
-
- function get(dataStore, idTenant) {
- /* jshint validthis:true */
- var self = this;
-
- var restObj = Restangular.one('restconf').one(dataStore).one('policy:tenants').one('tenant')
- .one(idTenant).one('policy');
-
- return restObj.get().then(function(data) {
- if (data.policy['endpoint-group']) {
- self.setData(data.policy['endpoint-group']);
- }
- });
- }
- }
-
- function createList() {
- var obj = new EpgList();
-
- return obj;
- }
- }
-
- return EpgListService;
-});
\ No newline at end of file
+++ /dev/null
-define([
- 'app/gbp/epg/epg.service',
- 'app/gbp/epg/epg-list.service',
-], function() {
- 'use strict';
-
- angular.module('app.gbp').controller('EpgController', EpgController);
-
- EpgController.$inject = ['$scope', '$stateParams', '$mdDialog', 'EpgService', 'EpgListService'];
-
- function EpgController($scope, $stateParams, $mdDialog, EpgService, EpgListService) {
- $scope.epgsTableQuery = {};
-
- // $scope.epg = EpgService.createObject();
- // $scope.epg.get($stateParams.epgId, $stateParams.tenantId);
-
- $scope.epgs = EpgListService.createList();
-
- /* methods */
- $scope.getEpgList = getEpgList;
- $scope.openEpgDialog = openEpgDialog;
- $scope.deleteEpgDialog = deleteEpgDialog;
-
- init();
-
- /* Implementations */
-
- /**
- * fills $scope.epgs array with data from data store
- */
- function getEpgList() {
- if($stateParams.tenantId) {
- $scope.epgs = EpgListService.createList();
- $scope.epgs.get('config', $stateParams.tenantId);
- }
- else {
- $scope.epgs = EpgListService.createList();
- $scope.epgs.get('config', $scope.rootTenant);
- }
- }
-
- /**
- * Initializing function
- */
- function init() {
- $scope.epgsTableQuery = {
- order: 'data.id',
- limit: 25,
- page: 1,
- options: [25, 50, 100],
- filter: ''
- };
-
- getEpgList();
- }
-
- function openEpgDialog(epgData) {
- $mdDialog.show({
- clickOutsideToClose: true,
- controller: 'AddEpgController',
- preserveScope: true,
- templateUrl: 'src/app/gbp/epg/dialog-add-epg.tpl.html',
- parent: angular.element(document.body),
- scope: $scope,
- locals: {
- epg: epgData
- }
- });
- }
-
- function deleteEpgDialog(epgData) {
- var confirm = $mdDialog.confirm()
- .title('Delete EPG')
- .textContent('Do you want to delete EPG ' + epgData.data.name + '?')
- .ok('Delete')
- .cancel('Cancel');
-
- $mdDialog.show(confirm).then(function() {
- epgData.deleteEpg($scope.rootTenant,
- function() {
- $scope.getEpgList();
- }
- );
- }, function() {
-
- });
- }
- }
-});
\ No newline at end of file
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').service('EpgService', EpgService);
-
- EpgService.$inject = ['Restangular'];
-
- function EpgService(Restangular) {
- /* methods */
- this.createObject = createObject;
-
-
- /**
- * Epg constructor
- * @constructor
- */
- function Epg() {
- /* properties */
- this.data = {};
- /* methods */
- this.setData = setData;
- this.get = get;
- this.put = put;
- this.deleteEpg = deleteEpg;
-
- /* Implementation */
- /**
- * fills Epg object with data
- * @param data
- */
- function setData(data) {
- this.data.id = data.id;
- this.data.name = data.name;
- this.data.description = data.description;
- this.data['intra-group-policy'] = data['intra-group-policy'];
-
- this.data['consumer-named-selector'] = data['consumer-named-selector'];
- this.data['provider-named-selector'] = data['provider-named-selector'];
- this.data['consumer-target-selector'] = data['consumer-target-selector'];
- this.data['provider-target-selector'] = data['provider-target-selector'];
-
- this.data['network-domain'] = data['network-domain'];
- this.data.parent = data.parent;
-
- this.data.requirement = data.requirement;
- this.data.capability = data.capability;
- }
-
- /**
- * gets one Epg object from Restconf
- * @param id
- * @returns {*}
- */
- function get(idEpg, idTenant, apiType, successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one(apiType).one('policy:tenants').one('tenant')
- .one(idTenant).one('policy').one('endpoint-group').one(this.data.id || idEpg);
-
- return restObj.get().then(function(data) {
- self.setData(data['endpoint-group'][0]);
- successCallback();
- });
- }
-
- function put(idTenant, successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(idTenant).one('policy').one('endpoint-group').one(self.data.id),
- dataObj = {'endpoint-group': [self.data]};
-
- return restObj.customPUT(dataObj).then(function(data) {
- successCallback(data);
- }, function(res) {
-
- });
- }
-
- function deleteEpg(idTenant, successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(idTenant).one('policy').one('endpoint-group').one(self.data.id);
-
- return restObj.remove().then(function(data) {
- successCallback(data);
- }, function(res) {
-
- });
- }
- }
-
- /**
- * creates Epg object and fills it with data if available
- * @param data
- * @returns {Epg}
- */
- function createObject(data) {
- var obj = new Epg();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return EpgService;
-});
\ No newline at end of file
+++ /dev/null
-<section flex layout="column">
- <div flex layout="row">
- <md-button ng-click="openEpgDialog()" class="md-primary">Add</md-button>
- <md-button ng-click="getEpgList()" class="md-primary">Reload</md-button>
- </div>
- <md-table-container ng-if="epgs.data.length">
- <table md-table>
- <thead md-head md-order="epgsTableQuery.order">
- <tr md-row>
- <th md-column md-order-by="data.id"><span>Id</span></th>
- <th md-column md-order-by="data.name"><span>Name</span></th>
- <th md-column md-order-by="data.description"><span>Description</span></th>
- <th md-column md-order-by="data['intra-group-policy']"><span>intra-group-policy</span></th>
- <th md-column md-order-by="data['network-domain']"><span>network-domain</span></th>
- <th md-column md-order-by="data.parent"><span>Parent</span></th>
- </tr>
- </thead>
- <tbody md-body>
- <tr md-row ng-repeat="epg in epgs.data | filter: epgsTableQuery.filter | orderBy : epgsTableQuery.order | limitTo: epgsTableQuery.limit : (epgsTableQuery.page -1) * epgsTableQuery.limit">
- <td md-cell>{{epg.data.id}}</td>
- <td md-cell>{{epg.data.name}}</td>
- <td md-cell>{{epg.data.description}}</td>
- <td md-cell>{{epg.data['intra-group-policy']}}</td>
- <td md-cell>{{epg.data['network-domain']}}</td>
- <td md-cell>{{epg.data.parent}}</td>
- <td md-cell>
- <md-button class="md-icon-button" ng-click="openEpgDialog(epg)">
- <md-icon>edit</md-icon>
- </md-button>
- <md-button class="md-icon-button" ng-click="deleteEpgDialog(epg)">
- <md-icon>delete</md-icon>
- </md-button>
- </td>
- </tr>
-
- </tbody>
- </table>
- <md-table-pagination md-limit="epgsTableQuery.limit"
- md-page="epgsTableQuery.page"
- md-options="epgsTableQuery.options"
- md-total="{{epgs.data.length}}"
- md-page-select="options.pageSelect">
- </md-table-pagination>
- </md-table-container>
-</section>
\ No newline at end of file
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('ForwardingService', ForwardingService);
-
- ForwardingService.$inject = ['Restangular'];
-
- function ForwardingService(Restangular) {
- /* methods */
- this.createObject = createObject;
-
- /**
- * Endpoint constructor
- * @constructor
- */
- function Forwarding() {
- /* properties */
- this.data = {};
-
- /* methods */
- this.setData = setData;
- this.get = get;
-
- /* Implementation */
- /**
- * fills Forwarding object with data
- * @param data
- */
-
- function setData(data) {
- this.data['forwarding-by-tenant'] = data['forwarding-by-tenant'];
- }
-
- function get(successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('forwarding:forwarding');
-
- return restObj.get().then(function(data) {
- self.data = data['forwarding']['forwarding-by-tenant'];
- (successCallback || angular.noop)();
- });
- }
- }
-
-
-
- /**
- * creates Endpoint object and fills it with data if available
- * @param data
- * @returns {Endpoint}
- */
- function createObject(data) {
- var obj = new Forwarding();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return ForwardingService;
-});
+++ /dev/null
-var gulp = require('gulp'),
- del = require('del'),
- gutil = require('gulp-util'),
- concat = require('gulp-concat'),
- runSequence = require('run-sequence'),
- install = require("gulp-install");
-
-var config = require( './build.config.js' );
-
-/**
- * Task for cleaning build directory
- */
-gulp.task('clean', function() {
- // You can use multiple globbing patterns as you would with `gulp.src`
- return del([config.build_dir]);
-});
-
-/**
- * Copy assets
- */
-gulp.task('copyCss', function () {
- return gulp.src(config.assets_files.css)
- .pipe(gulp.dest(config.build_dir + '/common'));
-});
-
-/**
- * Copy app files
- */
-gulp.task('copyTemplates', function () {
- gutil.log(gutil.colors.cyan('INFO :: copying APP Template files'));
- // Copy html
- return gulp.src(config.app_files.templates)
- .pipe(gulp.dest(config.build_dir));
-});
-
-gulp.task('copyAppJs', function () {
- gutil.log(gutil.colors.cyan('INFO :: copying APP Controller JS files'));
- return gulp.src(config.app_files.js)
- .pipe(gulp.dest(config.build_dir));
-});
-
-gulp.task('copyRootJs', function () {
- gutil.log(gutil.colors.cyan('INFO :: copying APP Root JS files'));
- return gulp.src(config.app_files.root_js)
- .pipe(gulp.dest(config.build_dir));
-});
-
-/**
- * Copy vendor files
- */
-gulp.task('copyVendorCss', function () {
- gutil.log(gutil.colors.cyan('INFO :: copying VENDOR css'));
- return gulp.src(config.vendor_files.css, { cwd : 'vendor/**' })
- .pipe(gulp.dest(config.build_dir + '/vendor'))
-});
-
-gulp.task('copyVendorFonts', function () {
- gutil.log(gutil.colors.cyan('INFO :: copying VENDOR fonts'));
- return gulp.src(config.vendor_files.fonts, { cwd : 'vendor/**' })
- .pipe(gulp.dest(config.build_dir + '/vendor'))
-});
-
-gulp.task('copyVendorJs', function () {
- gutil.log(gutil.colors.cyan('INFO :: copying VENDOR js files'));
- return gulp.src(config.vendor_files.js, { cwd : 'vendor/**' })
- .pipe(gulp.dest(config.build_dir + '/vendor'))
-});
-
-
-/**
- * Copy task aggregated
- */
-gulp.task('copy', function() {
- runSequence([
- 'copyCss',
- 'copyTemplates',
- 'copyAppJs',
- 'copyRootJs',
- 'copyVendorCss',
- 'copyVendorFonts'
- ], 'copyVendorJs');
-});
-
-/**
- * Build task
- */
-gulp.task('build', function(){
- runSequence('clean', 'copy');
-});
+++ /dev/null
-require.config({
- paths: {
- 'angular-material': 'app/gbp/vendor/angular-material/angular-material.min',
- 'angular-animate': 'app/gbp/vendor/angular-animate/angular-animate.min',
- 'angular-aria': 'app/gbp/vendor/angular-aria/angular-aria.min',
- 'angular-material-data-table': 'app/gbp/vendor/angular-material-data-table/dist/md-data-table.min',
- 'angular-messages': 'app/gbp/vendor/angular-messages/angular-messages.min',
- 'next-ui': 'app/gbp/vendor/NeXt/js/next.min',
- },
- shim: {
- 'angular-material': ['angular'],
- 'angular-animate': ['angular'],
- 'angular-aria': ['angular'],
- 'angular-material-data-table': ['angular', 'angular-material'],
- 'angular-messages': ['angular'],
- },
-});
-
-define(['app/gbp/common/gbp.module']);
+++ /dev/null
-{
- "author": "Daniel Malachovsky",
- "name": "opendaylight-gbp",
- "description": "openDayLight GBP UI",
- "version": "0.1.0",
- "homepage": "http://opendaylight.org",
- "license": "EPL-1.0",
- "bugs": "https://bugs.opendaylight.org/",
- "repository": {
- "type": "git",
- "url": "https://git.opendaylight.org/gerrit/groupbasedpolicy.git"
- },
- "dependencies": {
- "bower": "1.7.9",
- "del": "^2.2.0",
- "gulp-util": "^3.0.7",
- "gulp-concat": "^2.6.0",
- "gulp-install": "^0.6.0",
- "run-sequence": "^1.1.5"
- },
- "devDependencies": {
- "gulp": "^3.9.1"
- }
-}
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('PolicyController', PolicyController);
-
- PolicyController.$inject = ['$scope'];
-
- /* @ngInject */
- function PolicyController($scope) {
- console.log('PolicyController initialized');
- }
-
-});
-
+++ /dev/null
-<div ui-view="epg"></div>
-<div ui-view="contract"></div>
+++ /dev/null
-define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
- 'use strict';
-
- angular.module('app.gbp').service('ResolvedPolicyListService', ResolvedPolicyListService);
-
- ResolvedPolicyListService.$inject = ['$filter', 'Restangular', 'ResolvedPolicyService'];
-
- function ResolvedPolicyListService($filter, Restangular, ResolvedPolicyService) {
- /* methods */
- this.createList = createList;
-
-
- function ResolvedPolicyList() {
- /* properties */
- this.data = [];
-
- /* methods */
- this.aggregateResolvedPolicies = aggregateResolvedPolicies;
- this.get = get;
- this.clearData = clearData;
- this.setData = setData;
-
- /* Implementation */
- /**
- * fills ResolvedPolicyList object with data
- * @param data
- */
- function setData(data) {
- var self = this;
-
- if (data) {
- data.forEach(function (dataElement) {
- self.data.push(ResolvedPolicyService.createObject(dataElement));
- });
- }
- }
-
- /**
- * Clears data property of ResolvedPolicyList object
- */
- function clearData() {
- var self = this;
- self.data = [];
- }
-
- /**
- * Reads data from operational datastore and filters it by tenant property if available
- * @param tenant
- * @param successCallback
- */
- function get(tenant, successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('operational').one('resolved-policy:resolved-policies');
-
- return restObj.get().then(function (data) {
- if (tenant) {
- self.data = $filter('filter')(data['resolved-policies']['resolved-policy'], {
- 'consumer-tenant-id': tenant,
- 'provider-tenant-id': tenant,
- });
- }
- else {
- self.data = data['resolved-policies']['resolved-policy'];
- }
-
- successCallback();
- });
- }
-
- /**
- * Process resolved policies and returns object with epgs and contracts properties
- * @returns {{epgs: {}, contracts: {}}}
- */
- function aggregateResolvedPolicies() {
- var self = this,
- result = { epgs: {}, contracts: {} };
-
- self.data.forEach(function (rp) {
- processEpg(result, rp, 'consumer');
- processEpg(result, rp, 'provider');
-
- if (rp.hasOwnProperty('policy-rule-group-with-endpoint-constraints')) {
- processConstraints(
- result,
- rp['policy-rule-group-with-endpoint-constraints'],
- rp['provider-epg-id'],
- rp['consumer-epg-id']
- );
- }
- });
-
- return result;
-
- }
-
- /**
- * Checks if exists object in returnValue.epgs and if not, creates one
- * @param returnValue
- * @param resolvedPolicyItem
- * @param type
- */
- function processEpg(returnValue, resolvedPolicyItem, type) {
- if (!returnValue.epgs.hasOwnProperty(resolvedPolicyItem[type + '-epg-id'])) {
- returnValue.epgs[resolvedPolicyItem[type + '-epg-id']] = {
- 'provided-contracts': [],
- 'consumed-contracts': [],
- };
- }
-
-
-
- }
-
- /**
- * Process policy-rule-group-with-endpoint-constraints from resolved-policy.
- * Creates contracts and updates epgs with contract objects
- * @param returnValue
- * @param constraints
- * @param providerEpgId
- * @param consumerEpgId
- */
- function processConstraints(returnValue, constraints, providerEpgId, consumerEpgId) {
- constraints.forEach(function (element) {
- element['policy-rule-group'].forEach(function (el) {
- var linkId = generateLinkId(el['contract-id'], providerEpgId, consumerEpgId);
-
- if (!returnValue.contracts.hasOwnProperty(linkId)) {
- returnValue.contracts[linkId] = {
- 'contract-id': el['contract-id'],
- 'linkId': linkId,
- 'subjects': {},
- 'type': '',
- };
- }
-
- if (!returnValue.contracts[linkId].subjects.hasOwnProperty(el['subject-name'])) {
- returnValue.contracts[linkId].subjects[el['subject-name']] = { 'resolved-rule': [] };
- }
-
- returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'] =
- returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'].concat(el['resolved-rule']);
-
- Object.keys(returnValue.contracts[linkId].subjects).forEach(function(key) {
- returnValue.contracts[linkId].type =
- getContractType(returnValue.contracts[linkId].subjects[key]) ? 'chain' : 'allow';
- })
-
- updateEpg(returnValue, returnValue.contracts[linkId], providerEpgId, 'provided');
- updateEpg(returnValue, returnValue.contracts[linkId], consumerEpgId, 'consumed');
- });
- });
- }
-
- /**
- * Updates epgobject with contract object
- * @param returnValue
- * @param contract
- * @param epgId
- * @param epgType
- */
- function updateEpg(returnValue, contract, epgId, epgType) {
- returnValue.epgs[epgId][epgType + '-contracts'].push(contract);
- }
- }
-
- /**
- * Creates ResolvedPolicyList object
- * @param data
- * @returns {ResolvedPolicyList}
- */
- function createList(data) {
- var obj = new ResolvedPolicyList();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
-
- /**
- * creates linkId string from input parameters
- * @param contractId
- * @param providerEpgId
- * @param consumerEpgId
- * @returns {string}
- */
- function generateLinkId(contractId, providerEpgId, consumerEpgId) {
- return contractId + '++' + providerEpgId + '++' + consumerEpgId;
- }
-
- function getContractType(subject) {
- return subject['resolved-rule'].some(function(s) {
- return s.action.some(function (a) {
- return a['action-definition-id'] === 'Action-Chain';
- });
- });
- }
- }
-
- return ResolvedPolicyListService;
-});
+++ /dev/null
-define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('ResolvedPolicyController', ResolvedPolicyController);
-
- ResolvedPolicyController.$inject = ['$rootScope', '$scope', '$mdDialog', 'EpgService', 'NextTopologyService'];
-
- /* @ngInject */
- function ResolvedPolicyController($rootScope, $scope, $mdDialog, EpgService, NextTopologyService) {
-
- $scope.reloadTopology = reloadTopology;
-
- $scope.cbkFunctions = {
- clickNode: function(node){
- var epg = $scope.resolvedPolicy.epgs[node['_model']['_id']];
-
- epg.id = node['_model']['_id'];
- $scope.openSidePanel('resolved-policy/sidepanel/views/epg-sidepanel', epg);
- $scope.$apply();
-
- NextTopologyService.highlightNode($rootScope.nxTopology, node['_model']['_id']);
- },
- clickLink: function(link){
- var resolvedContract = $scope.resolvedPolicy.contracts[link['_model']['_id']];
- resolvedContract.linkId = link['_model']['_id'];
- $scope.openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', resolvedContract);
- $scope.$apply();
-
- NextTopologyService.highlightLink($rootScope.nxTopology, link['_model']['_id']);
- },
- topologyGenerated: function(){
- }
- };
-
- //function openSfcDialog(chainName) {
- // $mdDialog.show({
- // clickOutsideToClose: true,
- // controller: 'SfcTopologyController',
- // preserveScope: true,
- // templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
- // parent: angular.element(document.body),
- // scope: $scope,
- // locals: {
- // chainName: chainName,
- // },
- // });
- //}
-
- function reloadTopology() {
- $scope.fillTopologyData();
- }
-
- $scope.$watch('nxTopology', function() {
- $rootScope.nxTopology = $scope.nxTopology;
- });
- }
-
-});
-
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').service('ResolvedPolicyService', ResolvedPolicyService);
-
- ResolvedPolicyService.$inject = [];
-
- function ResolvedPolicyService() {
- /* methods */
- this.createObject = createObject;
-
-
- function ResolvedPolicy() {
- /* properties */
- this.data = {};
- /* methods */
- this.setData = setData;
-
- /* Implementation */
-
- function setData(data) {
- this.data['consumer-tenant-id'] = data['consumer-tenant-id'];
- this.data['consumer-epg-id'] = data['consumer-epg-id'];
- this.data['provider-tenant-id'] = data['provider-tenant-id'];
- this.data['provider-epg-id'] = data['provider-epg-id'];
- this.data['policy-rule-group-with-endpoint-constraints'] =
- data['policy-rule-group-with-endpoint-constraints'];
- }
-
-
- }
-
- function createObject(data) {
- var obj = new ResolvedPolicy();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return ResolvedPolicyService;
-});
+++ /dev/null
-<div id="topology-container" flex style="height: 100%;">
- <section class="legendBox">
- <md-button md-no-ink class="md-primary reload-button" ng-click="reloadTopology()">
- <i class="material-icons">sync</i> Reload topology
- </md-button>
- <ul>
- <li class="item"><span class="line green"></span>Allow</li>
- <li class="item"><span class="line blue"></span>Chain</li>
- </ul>
- </section>
-
- <next-topology topology-data="topologyData" cbk-functions="cbkFunctions" dictionaries="nxDict" topo="nxTopology"
- topo-colors="nxTopoColors">
- </next-topology>
-</div>
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').controller('ContractListSidePanelController', ContractListSidePanelController);
-
- ContractListSidePanelController.$inject = ['$scope'];
-
- function ContractListSidePanelController($scope) {
- $scope.fadeAll();
-
- $scope.sidePanelContracts = Object.keys($scope.resolvedPolicy.contracts).map(function (k) {
- var ob = $scope.resolvedPolicy.contracts[k];
- return ob;
- });
- $scope.activeObject = 'contract';
- }
-});
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').controller('ContractSidePanelController', ContractSidePanelController);
-
- ContractSidePanelController.$inject = ['$scope'];
-
- function ContractSidePanelController($scope) {
- $scope.getObjectsCount = getObjectsCount;
-
- /**
- *
- * @param obj
- * @returns {*}
- */
- function getObjectsCount(obj) {
- if(obj)
- return Object.keys(obj).length;
- else
- return 0;
- }
- }
-});
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').controller('EpgListSidePanelController', EpgListSidePanelController);
-
- EpgListSidePanelController.$inject = ['$scope'];
-
- function EpgListSidePanelController($scope) {
- $scope.fadeAll();
-
- $scope.sidePanelEpgs = Object.keys($scope.resolvedPolicy.epgs).map(function (k) {
- var ob = $scope.resolvedPolicy.epgs[k];
- ob.id = k;
-
- return ob;
- });
- $scope.activeObject = 'epg';
- }
-});
\ No newline at end of file
+++ /dev/null
-define([], function() {
- 'use strict';
-
- angular.module('app.gbp').controller('EpgSidePanelController', EpgSidePanelController);
-
- EpgSidePanelController.$inject = ['$scope', 'EndpointsListService'];
-
- function EpgSidePanelController($scope, EndpointsListService) {
- $scope.endpoints = EndpointsListService.createList();
-
- function getEndpoints() {
- if($scope.sidePanelObject)
- $scope.endpoints.getByEpg($scope.sidePanelObject, $scope.rootTenant);
- }
-
- $scope.$watch('sidePanelObject', getEndpoints);
- $scope.$on('endpointChanged', getEndpoints);
- }
-});
+++ /dev/null
-<md-content flex>
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', sidePanelObject)" role="button">{{sidePanelObject.data.id}}</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb">{{sidePanelObject.data.clause[innerObj.clause].name}}</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Clause info</md-subheader>
- <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
- <span flex="50" class="flex-50"><strong>Clause name</strong></span>
- <span flex="" class="ng-binding flex">{{sidePanelObject.data.clause[innerObj.clause].name}}</span>
- </div>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Subject refs ({{sidePanelObject.data.clause[innerObj.clause]['subject-refs'].length}})</md-subheader>
- <md-list>
- <ng-repeat ng-repeat="ref in sidePanelObject.data.clause[innerObj.clause]['subject-refs']">
- <md-list-item ng-click="toggleExpanded(ref)">
- {{ref}}
- <md-content ng-show="ref.expanded" class="md-whiteframe-2dp ng-scope flex layout-margin">
- <div layout="row" class="layout-row">
- <span flex="50" class="flex-50"><strong>Subject refs</strong></span>
- <span flex class="ng-binding flex">{{ref}}</span>
- </div>
- </md-content>
- </md-list-item>
- </ng-repeat>
- </md-list>
-</md-content>
\ No newline at end of file
+++ /dev/null
-<md-content ng-controller="ContractListSidePanelController">
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb">Contracts</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Contracts list ({{sidePanelContracts.length}})</md-subheader>
- <md-list>
- <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', contract)"
- ng-mouseenter="highlightLink(contract.linkId)"
- ng-mouseleave="fadeAll()"
- ng-repeat="contract in sidePanelContracts">
- {{contract['contract-id']}}
- </md-list-item>
- </md-list>
-</md-content>
+++ /dev/null
-<md-content ng-controller="ContractSidePanelController">
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb">{{sidePanelObject['contract-id']}}</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Contract info</md-subheader>
- <div layout="row" class="layout-padding-lr15 layout-padding-b15 layout-row">
- <span flex="50" class="flex-50"><strong>Contract ID</strong></span>
- <span flex="" class="ng-binding flex">{{sidePanelObject['contract-id']}}</span>
- </div>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Subject list ({{getObjectsCount(sidePanelObject.subjects)}})</md-subheader>
- <md-list>
- <ng-repeat ng-repeat="(key, value) in sidePanelObject.subjects">
- <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/subject-sidepanel', sidePanelObject, 'subject', key)">
- {{key}}
- </md-list-item>
- </ng-repeat>
- </md-list>
-</md-content>
+++ /dev/null
-<md-content ng-controller="EpgListSidePanelController">
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb">Endpoint-groups</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Endpoint-groups ({{sidePanelEpgs.length}})</md-subheader>
- <md-list>
- <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/epg-sidepanel', epg)"
- ng-mouseenter="highlightNode(epg.id)"
- ng-mouseleave="fadeAll()"
- ng-repeat="epg in sidePanelEpgs">
- {{epg.id}}
- </md-list-item>
- </md-list>
-</md-content>
+++ /dev/null
-<md-content ng-controller="EpgSidePanelController">
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/epg-list-sidepanel')" role="button">Endpoint-groups</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb">{{sidePanelObject.id}}</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Endpoint-group info</md-subheader>
- <div layout="row" class="layout-padding-lr15 layout-padding-b15 layout-row">
- <span flex="50" class="flex-50"><strong>Endpoint-group ID</strong></span>
- <span flex="" class="ng-binding flex">{{sidePanelObject.id}}</span>
- </div>
- <md-divider></md-divider>
- <div ng-if="sidePanelObject['provided-contracts'].length">
- <md-subheader class="md-primary">Provided contracts ({{sidePanelObject['provided-contracts'].length}})</md-subheader>
- <md-list>
- <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', providedContract);"
- ng-repeat="providedContract in sidePanelObject['provided-contracts']"
- ng-mouseenter="highlightLink(providedContract.linkId)"
- ng-mouseleave="highlightNode(sidePanelObject.id)"
- >
- {{providedContract['contract-id']}}
- </md-list-item>
- </md-list>
- </div>
- <div ng-if="sidePanelObject['consumed-contracts'].length">
- <md-subheader class="md-primary">Consumed contracts ({{sidePanelObject['consumed-contracts'].length}})</md-subheader>
- <md-list>
- <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', consumedContract);"
- ng-repeat="consumedContract in sidePanelObject['consumed-contracts']"
- ng-mouseenter="highlightLink(consumedContract.linkId)"
- ng-mouseleave="highlightNode(sidePanelObject.id)"
- >
- {{consumedContract['contract-id']}}
- </md-list-item>
- </md-list>
- </div>
- <md-divider></md-divider>
- <md-subheader class="md-primary">
- <div layout="row" class="layout-row">
- <span>Endpoints ({{endpoints.data.length}})</span>
- </div>
- </md-subheader>
- <md-list class="expander">
- <md-list-item class="md-4-line" layout="row" ng-repeat="endpoint in endpoints.data">
- <div layout-padding flex="15">
- <h3>{{endpoint.getEndpointContextTypeAcronym()}}</h3>
- <md-tooltip md-direction="right">{{endpoint.data['context-type']}}</md-tooltip>
- </div>
- <div class="md-list-item-text" flex="60">
- <h3>{{endpoint.data['context-id']}}</h3>
- <p>Address: {{endpoint.data.address}} </p>
- <p>Network Domain: {{endpoint.data['network-containment']['network-domain-id']}} </p>
- <p>SGT: {{endpointSgtList.findSgtsForEndpoint(endpoint)}} </p>
- </div>
- <div flex="10">
- <md-button class="md-icon-button" ng-click="rootOpenEndpointDialog('edit', endpoint)">
- <md-icon>edit</md-icon>
- </md-button>
- </div>
- <div flex="10">
- <md-button class="md-icon-button" ng-click="rootDeleteEndpointDialog(endpoint)">
- <md-icon>delete</md-icon>
- </md-button>
- </div>
- </md-list-item>
- </md-list>
-</md-content>
+++ /dev/null
-<md-content flex>
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', sidePanelObject)" role="button">{{sidePanelObject['contract-id']}}</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/subject-sidepanel', sidePanelObject)" role="button">{{innerObj.subject}}</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb">{{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].name}}</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Rule info</md-subheader>
- <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
- <span flex="50" class="flex-50"><strong>Resolved rule name</strong></span>
- <span flex="" class="ng-binding flex">{{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].name}}</span>
- </div>
- <md-divider></md-divider>
- <md-subheader class="md-primary">
- <div layout="row" class="layout-row">
- <span>Actions ({{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].action.length}})</span>
- <span ng-if="sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].action.length">
- </span>
- </div>
- </md-subheader>
- <md-list>
- <md-list-item class="md-4-line" layout="row"
- ng-repeat="action in sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].action">
- <div layout-padding flex="10">
- <h3>{{action.order}}</h3>
- <md-tooltip md-direction="right">
- Order
- </md-tooltip>
- </div>
- <div class="md-list-item-text" flex>
- <h3>{{action.name}}</h3>
- <p>Action definition ID: {{action['action-definition-id']}} </p>
- <p ng-if="action['action-definition-id'] === 'Action-Chain'">Parameter name: {{action['parameter-value'][0].name}} </p>
- <p ng-if="action['action-definition-id'] === 'Action-Chain'">Parameter value: {{action['parameter-value'][0]['string-value']}} </p>
- </div>
- <div ng-if="action['action-definition-id'] === 'Action-Chain'" flex="10">
- <md-button class="md-icon-button margin-lr0" ng-click="openSfcDialog(action['parameter-value'][0]['string-value'])">
- <md-icon>visibility</md-icon>
- </md-button>
- </div>
- </md-list-item>
- </md-list>
- <md-divider></md-divider>
- <md-subheader class="md-primary">
- <div layout="row" class="layout-row">
- <span>Classifiers ({{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].classifier.length}})</span>
- <span class="flex" flex></span>
- </div>
- </md-subheader>
- <md-list class="expander">
- <md-list-item ng-repeat="classifier in sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].classifier"
- class="md-4-line">
- <div layout-padding flex="15">
- <h3>{{classifier.direction}}</h3>
- <md-tooltip md-direction="right">
- Direction
- </md-tooltip>
- </div>
- <div class="md-list-item-text" flex="80">
- <h3>{{classifier.name}}</h3>
- <p>Classifier definition ID: {{classifier['classifier-definition-id']}} </p>
- <p>Connection tracking: {{classifier['connection-tracking']}} </p>
- <p ng-repeat="param in classifier['parameter-value']">{{param.name}}: {{param['int-value']}} </p>
- </div>
- </md-list-item>
- </md-list>
-</md-content>
+++ /dev/null
-<md-content flex>
- <div layout="row" class="layout-padding-lr15 layout-row">
- <ul class="breadcrumbs">
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', sidePanelObject)" role="button">{{sidePanelObject['contract-id']}}</li>
- <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
- <li class="breadcrumb">{{innerObj.subject}}</li>
- </ul>
- </div>
- <md-divider></md-divider>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Subject info</md-subheader>
- <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
- <span flex="50" class="flex-50"><strong>Subject name</strong></span>
- <span flex="" class="ng-binding flex">{{innerObj.subject}}</span>
- </div>
- <md-divider></md-divider>
- <md-subheader class="md-primary">Resolved rule list ({{sidePanelObject.subjects[innerObj.subject]['resolved-rule'].length}})</md-subheader>
- <md-list>
- <ng-repeat ng-repeat="(key, rule) in sidePanelObject.subjects[innerObj.subject]['resolved-rule'] | orderBy: 'order'">
- <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/rule-sidepanel', sidePanelObject, 'rule', key)">
- <span class="layout-padding-r10">
- <h4 class="order">{{rule.order}}</h4>
- </span>
- <span>{{rule.name}}</span>
- </md-list-item>
- </ng-repeat>
- </md-list>
-</md-content>
+++ /dev/null
-define([
- 'app/gbp/sfc/sfc.service'
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('SfcTopologyController', SfcTopologyController);
-
- SfcTopologyController.$inject = ['$filter', '$mdDialog', '$scope', 'chainName', 'SfcService'];
- /* @ngInject */
- function SfcTopologyController($filter, $mdDialog, $scope, chainName, SfcService) {
- /* properties */
- $scope.chain = SfcService.createObject({name: chainName});
-
- /* methods */
- $scope.closeDialog = closeDialog;
-
- /* Implementations */
-
- $scope.chain.get(function() {
- $scope.chain.data && $scope.chain.data['sfc-service-function'] &&
- $scope.chain.data['sfc-service-function'].length && $scope.viewTopology();
-
- $scope.topologyLoaded = true;
- });
-
- function closeDialog(){
- $mdDialog.cancel();
- }
-
- function nodeTooltip() {
- nx.define('MyNodeTooltip', nx.ui.Component, {
- properties: {
- node: {},
- topology: {},
- },
- view: {
- content: [{
- tag: 'p',
- content: [{
- tag: 'label',
- content: '{#node.model.data.type}',
- }],
- }],
- },
- });
- }
-
- $scope.viewTopology = function() {
- nodeTooltip();
- $scope.topologySfc = new nx.graphic.Topology({
- height: 400,
- width: 600,
- scalable: true,
- theme: 'blue',
- enableGradualScaling: true,
- nodeConfig: {
- color: '#0386d2',
- //label: 'model.label',
- label: function (vertex) {
- return vertex.get().label + ' (' + vertex.get().type + ')';
- },
- scale: 'model.scale',
- iconType: function (vertex) {
- var type = vertex.get().type;
- switch (type) {
- case 'firewall':
- return 'firewall';
- case 'dpi':
- return 'accesspoint';
- case 'qos':
- return 'wlc';
- default:
- return 'unknown';
- }
- },
- },
- linkConfig: {
- label: 'model.label',
- linkType: 'parallel',
- color: '#0386d2',
- width: 5,
- },
- showIcon: true,
- enableSmartNode: false,
- tooltipManagerConfig: {
- showLinkTooltip: false,
- showNodeTooltip: false,
- //nodeTooltipContentClass: 'MyNodeTooltip',
- },
- });
- $scope.app = new nx.ui.Application;
-
- var nodes = [];
- var links = [];
-
- $scope.chain.data['sfc-service-function'].forEach(function(sf, index) {
- nodes.push({
- id: sf.name,
- label: sf.name,
- type: SfcService.getSfTypeShort(sf.type),
- x: 100 * (index + 1),
- y: 400,
- });
-
- index>0 && links.push({
- source: index - 1,
- target: index,
- });
- })
-
- $scope.topologySfc.data({
- nodes: nodes,
- links: links,
- });
-
- $scope.app.container(document.getElementById('next-vpp-topo'));
- $scope.topologySfc.attach($scope.app);
- };
-
-
- }
-});
+++ /dev/null
-<md-dialog ng-cloak aria-label="vpp topo">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <h2 style="color: white">
- Detail for chain {{chain.data.name}} ({{chain.data.symmetric ? 'Symmetric' : 'Asymmetric'}})
- </h2>
- <span flex></span>
- <md-button class="md-icon-button" ng-click="closeDialog()" aria-label="close button">
- <div>X</div>
- </md-button>
- </div>
- </md-toolbar>
- <md-dialog-content style="max-width:600px;max-height:400px;overflow:hidden">
- <div id="next-vpp-topo"></div>
- </md-dialog-content>
-</md-dialog>
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('SfcService', SfcService);
-
- SfcService.$inject = ['Restangular'];
-
- function SfcService(Restangular) {
- /* methods */
- this.createObject = createObject;
- this.getSfTypeShort = getSfTypeShort;
-
- /**
- * Sfc constructor
- * @constructor
- */
- function Sfc() {
- /* properties */
- this.data = {};
-
- /* methods */
- this.setData = setData;
- this.get = get;
-
- /* Implementation */
- /**
- * fills Sfc object with data
- * @param data
- */
-
- function setData(data) {
- this.data.name = data.name;
- this.data.symmetric = data.symmetric;
- this.data['sfc-service-function'] = data['sfc-service-function'];
- }
- /**
- * gets one Sfc object from Restconf
- * @param id
- * @returns {*}
- */
-
- function get(successCbk) {
-
- var self = this,
- restObj = Restangular
- .one('restconf')
- .one('config')
- .one('service-function-chain:service-function-chains')
- .one('service-function-chain')
- .one(self.data.name);
-
- return restObj.get().then(function(data) {
- self.data = data['service-function-chain'][0];
- (successCbk || angular.noop)();
- });
- }
- }
-
- /**
- * creates Endpoint object and fills it with data if available
- * @param data
- * @returns {Endpoint}
- */
- function createObject(data) {
- var obj = new Sfc();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
-
- function getSfTypeShort(sfType) {
- return sfType.replace('service-function-type:', '').trim();
- }
- }
-
- return SfcService;
-});
+++ /dev/null
-define([
- 'app/gbp/tenant/tenant.service'
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('AddTenantController', AddTenantController);
-
- AddTenantController.$inject = ['$mdDialog', '$scope', 'TenantService', 'tenant'];
- /* @ngInject */
- function AddTenantController($mdDialog, $scope, TenantService, tenant) {
- /* properties */
- $scope.tenant = tenant ? tenant : TenantService.createObject();
-
- /* methods */
- $scope.closeDialog = closeDialog;
- $scope.save = save;
- /* Implementations */
-
- function closeDialog(){
- $mdDialog.cancel();
- $scope.getTenantList();
- }
-
- function save() {
- $scope.tenant.put(function(data) {
- $scope.closeDialog();
- }, function(err) {
- } );
- }
-
- }
-});
+++ /dev/null
-<md-dialog ng-cloak class="gbpDialogWrapper">
- <form name="tenantForm">
- <md-toolbar>
- <div class="md-toolbar-tools">
- <h2>Tenant</h2>
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-button">Close dialog</md-button>
- </div>
- </md-toolbar>
- <md-dialog-content style="width:350px;">
- <div layout="column" class="layout-padding-lr15">
- <div layout="row">
- <md-input-container flex>
- <label>Id</label>
- <input name="id" ng-model="tenant.data.id" ng-required="true">
- <div ng-messages="tenantForm.id.$error">
- <div ng-message="required">Required field</div>
- </div>
- </md-input-container>
- <md-input-container flex>
- <label>Name</label>
- <input name="name" ng-model="tenant.data.name" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\\-_.])*$/" ng-required="true">
- <div ng-messages="tenantForm.name.$error">
- <div ng-message="required">Required field.</div>
- <div ng-message="pattern">
- Invalid pattern.
- <md-tooltip md-direction="right" style="padding-left: 10px;">Value must match: ^[a-zA-Z]([a-zA-Z0-9\\-_.])*$</md-tooltip>
- </div>
- </div>
- </md-input-container>
- </div>
- <div layout="row">
- <md-input-container flex>
- <label>Description</label>
- <input name="description" ng-model="tenant.data.description">
- </md-input-container>
- </div>
- </div>
- </md-dialog-content>
- <md-dialog-actions layout="row">
- <span flex></span>
- <md-button ng-click="closeDialog()" class="md-primary">
- Close
- </md-button>
- <md-button ng-click="save()" style="margin-right:20px;" ng-disabled="tenantForm.$invalid" class="md-primary">
- Save
- </md-button>
- </md-dialog-actions>
- </form>
-</md-dialog>
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('TenantListService', TenantListService);
-
- TenantListService.$inject = ['Restangular', 'TenantService'];
-
- function TenantListService(Restangular, TenantService) {
- /* methods */
- this.createList = createList;
-
- function TenantList() {
- /* properties */
- this.data = [];
- /* methods */
- this.clearData = clearData;
- this.setData = setData;
- this.get = get;
-
- /* Implementation */
-
- function clearData() {
- var self = this;
-
- self.data = [];
- }
-
- /**
- * fills TenantList object with data
- * @param data
- */
- function setData(data) {
- var self = this;
- data.forEach(function (dataElement) {
- self.data.push(TenantService.createObject(dataElement));
- });
- }
-
- function get(dataStore) {
- /* jshint validthis:true */
- var self = this;
-
- var restObj = Restangular.one('restconf').one(dataStore).one('policy:tenants');
-
- return restObj.get().then(function(data) {
- if (data.tenants.tenant) {
- self.setData(data.tenants.tenant);
- }
- });
- }
- }
-
- function createList() {
- var obj = new TenantList();
-
- return obj;
- }
- }
-
- return TenantListService;
-});
+++ /dev/null
-define([
- 'app/gbp/tenant/tenant.service',
- 'app/gbp/tenant/tenant-list.service',
-], function () {
- 'use strict';
-
- angular.module('app.gbp').controller('TenantController', TenantController);
-
- TenantController.$inject = ['$mdDialog', '$scope', 'TenantListService'];
- /* @ngInject */
- function TenantController($mdDialog, $scope, TenantListService) {
- /* properties */
- $scope.tenants = TenantListService.createList();
- $scope.tenantsTableQuery = {};
-
- /* methods */
- $scope.getTenantList = getTenantList;
- $scope.openTenantDialog = openTenantDialog;
- $scope.deleteTenantDialog = deleteTenantDialog;
-
- init();
-
- /* Implementations */
-
- /**
- * fills $scope.tenants array with data from data store
- */
- function getTenantList() {
- $scope.tenants = TenantListService.createList();
- $scope.tenants.get('config');
- }
-
- /**
- * Initializing function
- */
- function init() {
- $scope.tenantsTableQuery = {
- order: "data.id",
- limit: 25,
- page: 1,
- options: [25, 50, 100],
- filter: ''
- };
-
- getTenantList();
- }
-
- function openTenantDialog(tenantData) {
- $mdDialog.show({
- clickOutsideToClose: true,
- controller: 'AddTenantController',
- preserveScope: true,
- templateUrl: 'src/app/gbp/tenant/dialog-add-tenant.tpl.html',
- parent: angular.element(document.body),
- scope: $scope,
- locals: {
- tenant: tenantData
- }
- });
- }
-
- function deleteTenantDialog(tenantData) {
- var confirm = $mdDialog.confirm()
- .title('Delete tenant')
- .textContent('Do you want to delete tenant ' + tenantData.data.name + '?')
- .ok('Delete')
- .cancel('Cancel');
-
- $mdDialog.show(confirm).then(function() {
- tenantData.deleteTenant(
- function() {
- $scope.getTenantList();
- }
- );
- }, function() {
-
- });
- }
-
- }
-});
+++ /dev/null
-define([], function () {
- 'use strict';
-
- angular.module('app.gbp').service('TenantService', TenantService);
-
- TenantService.$inject = ['Restangular'];
- /* @ngInject */
- function TenantService(Restangular) {
- /* methods */
- this.createObject = createObject;
-
-
- /**
- * Tenant constructor
- * @constructor
- */
- function Tenant() {
- /* properties */
- this.data = {};
- /* methods */
- this.setData = setData;
- this.get = get;
- this.put = put;
- this.deleteTenant = deleteTenant;
-
- /* Implementation */
- /**
- * fills Tenant object with data
- * @param data
- */
- function setData(data) {
- this.data.id = data.id;
- this.data.name = data.name;
- this.data.description = data.description;
-
- // TODO: use objects
- this.data['forwarding-context'] = data['forwarding-context'];
- this.data.policy = data.policy;
- }
-
- /**
- * gets one Tenant object from Restconf
- * @param id
- * @returns {*}
- */
- function get(id) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(this.data.id || id);
-
- return restObj.get().then(function (data) {
- self.setData(data.tenant[0]);
- });
- }
-
- function put(successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(self.data.id),
- dataObj = {tenant: [self.data]};
-
- return restObj.customPUT(dataObj).then(function(data) {
- successCallback(data);
- }, function(res) {
-
- });
- }
-
- function deleteTenant(successCallback) {
- var self = this;
-
- var restObj = Restangular.one('restconf').one('config').one('policy:tenants').one('tenant')
- .one(self.data.id);
-
- return restObj.remove().then(function(data) {
- successCallback(data);
- }, function(res) {
-
- });
- }
- }
-
- /**
- * creates Tenant object and fills it with data if available
- * @param data
- * @returns {Tenant}
- */
- function createObject(data) {
- var obj = new Tenant();
-
- if (data) {
- obj.setData(data);
- }
-
- return obj;
- }
- }
-
- return TenantService;
-});
+++ /dev/null
-<section flex layout="column">
- <div flex layout="row">
- <md-button ng-click="openTenantDialog()" class="md-primary">Add</md-button>
- <md-button ng-click="getTenantList()" class="md-primary">Reload</md-button>
- </div>
- <md-table-container>
- <table md-table>
- <thead md-head md-order="tenantsTableQuery.order">
- <tr md-row>
- <th md-column md-order-by="data.id"><span>Id</span></th>
- <th md-column md-order-by="data.name"><span>Name</span></th>
- <th md-column md-order-by="data.description"><span>Description</span></th>
- <th md-column><span>Actions</span></th>
- </tr>
- </thead>
- <tbody md-body>
- <tr md-row ng-repeat="tenant in tenants.data | filter: tenantsTableQuery.filter | orderBy : tenantsTableQuery.order | limitTo: tenantsTableQuery.limit : (tenantsTableQuery.page -1) * tenantsTableQuery.limit">
- <td md-cell>{{tenant.data.id}}</td>
- <td md-cell>{{tenant.data.name}}</td>
- <td md-cell>{{tenant.data.description}}</td>
- <td md-cell>
- <md-button class="md-icon-button" ng-click="openTenantDialog(tenant)">
- <md-icon>edit</md-icon>
- </md-button>
- <md-button class="md-icon-button w85" ng-click="deleteTenantDialog(tenant)">
- <md-icon>delete</md-icon>
- </md-button>
- </td>
- </tr>
-
- </tbody>
- </table>
- <md-table-pagination md-limit="tenantsTableQuery.limit"
- md-page="tenantsTableQuery.page"
- md-options="tenantsTableQuery.options"
- md-total="{{tenants.data.length}}"
- md-page-select="options.pageSelect">
- </md-table-pagination>
- </md-table-container>
-</section>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2014 Inocybe Technologies, and others. All rights reserved.
-
- This program and the accompanying materials are made available under the
- terms of the Eclipse Public License v1.0 which accompanies this distribution,
- and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>org.opendaylight.groupbasedpolicy</groupId>
- <artifactId>groupbasedpolicy-ui</artifactId>
- <!-- <name> formatting is used by autorelease to parse and notify projects on
- build failure. Please do not modify this unless you have a good reason. -->
- <name>ODL :: groupbasedpolicy :: ${project.artifactId}</name>
- <description>Resources</description>
- <version>0.8.0-SNAPSHOT</version>
- <packaging>pom</packaging>
-
- <prerequisites>
- <maven>3.0</maven>
- </prerequisites>
-
- <modules>
- <module>module</module>
- <module>bundle</module>
- </modules>
-
-</project>
namespace "urn:opendaylight:groupbasedpolicy:neutron:ovsdb:params";
prefix "neutron-ovsdb-params";
- import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
-
description
"This module contains the base YANG definitions for
neutron-ovsdb mudule params.";
<module>neutron-mapper</module>
<module>neutron-vpp-mapper</module>
<module>neutron-ovsdb</module>
- <module>groupbasedpolicy-ui</module>
<module>distribution-karaf</module>
<module>features</module>
<module>sxp-integration</module>