diff --git a/MANIFEST.in b/MANIFEST.in
index 0b8c048..6bd6c0d 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -9,4 +9,10 @@ include setup.py
recursive-include vitragedashboard/enabled *
recursive-include vitragedashboard/static *
-recursive-include vitragedashboard/templates *
\ No newline at end of file
+recursive-include vitragedashboard/templates *
+
+recursive-include vitragealarms/static *
+recursive-include vitragealarms/templates *
+
+recursive-include vitrageentities/static *
+recursive-include vitrageentities/templates *
\ No newline at end of file
diff --git a/setup.cfg b/setup.cfg
index 7a1421b..297dc9d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -21,8 +21,11 @@ classifier =
[files]
packages =
+ vitrageentities
+ vitragealarms
vitragedashboard
+
[build_sphinx]
source-dir = doc/source
build-dir = doc/build
diff --git a/vitragealarms/__init__.py b/vitragealarms/__init__.py
new file mode 100644
index 0000000..484fd1e
--- /dev/null
+++ b/vitragealarms/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import pbr.version
+
+
+__version__ = pbr.version.VersionInfo(
+ 'vitragealarms').version_string()
diff --git a/vitragealarms/panel.py b/vitragealarms/panel.py
new file mode 100644
index 0000000..b1b1f02
--- /dev/null
+++ b/vitragealarms/panel.py
@@ -0,0 +1,22 @@
+# Copyright 2015 IBM Corp.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+
+
+class AlarmsVitrage(horizon.Panel):
+ name = _("Alarms")
+ slug = "vitragealarms"
diff --git a/vitragealarms/templates/alarms/index.html b/vitragealarms/templates/alarms/index.html
new file mode 100644
index 0000000..1b4aa80
--- /dev/null
+++ b/vitragealarms/templates/alarms/index.html
@@ -0,0 +1,15 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block title %}{% trans "Topology" %}{% endblock %}
+
+{% block page_header %}
+
+{% endblock page_header %}
+
+{% block main %}
+
+
+
+
+{% endblock %}
+
diff --git a/vitragealarms/urls.py b/vitragealarms/urls.py
new file mode 100644
index 0000000..4179e70
--- /dev/null
+++ b/vitragealarms/urls.py
@@ -0,0 +1,22 @@
+# Copyright 2015 IBM Corp.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from django.conf import urls
+
+from vitragealarms import views
+
+urlpatterns = urls.patterns(
+ '',
+ urls.url(r'^$', views.IndexView.as_view(), name='index'),
+)
diff --git a/vitragealarms/version.py b/vitragealarms/version.py
new file mode 100644
index 0000000..44d2235
--- /dev/null
+++ b/vitragealarms/version.py
@@ -0,0 +1,15 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import pbr.version
+
+version_info = pbr.version.VersionInfo('vitrage_alarms_ui')
diff --git a/vitragealarms/views.py b/vitragealarms/views.py
new file mode 100644
index 0000000..1d3e84e
--- /dev/null
+++ b/vitragealarms/views.py
@@ -0,0 +1,32 @@
+# Copyright 2012 Alcatel-Lucent, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon import views
+
+import json
+
+
+class IndexView(views.APIView):
+ # A very simple class-based view...
+ template_name = 'alarms/index.html'
+
+ def get_data(self, request, context, *args, **kwargs):
+ topology_settings = {
+ 'VITRAGE_VERSION': {
+ 'VER': 1,
+ 'REL': 1
+ }
+ }
+ context['TOPOLOGY_VITRAGE_SETTINGS'] = json.dumps(topology_settings)
+ return context
diff --git a/vitragedashboard/enabled/_91_project_alarms_vitrage_panel.py b/vitragedashboard/enabled/_91_project_alarms_vitrage_panel.py
new file mode 100644
index 0000000..a325959
--- /dev/null
+++ b/vitragedashboard/enabled/_91_project_alarms_vitrage_panel.py
@@ -0,0 +1,27 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# The name of the panel to be added to HORIZON_CONFIG. Required.
+PANEL = 'alarms_vitrage_panel'
+# The name of the dashboard the PANEL associated with. Required.
+PANEL_DASHBOARD = 'project'
+# The name of the panel group the PANEL is associated with.
+PANEL_GROUP = 'vitrage_panel_group'
+
+# Python panel class of the PANEL to be added.
+ADD_PANEL = 'vitragealarms.panel.AlarmsVitrage'
+
+ADD_INSTALLED_APPS = ['vitragealarms']
+
+ADD_ANGULAR_MODULES = ['horizon.dashboard.project.vitrage']
+
+AUTO_DISCOVER_STATIC_FILES = True
diff --git a/vitragedashboard/enabled/_92_project_entities_vitrage_panel.py b/vitragedashboard/enabled/_92_project_entities_vitrage_panel.py
new file mode 100644
index 0000000..9375a89
--- /dev/null
+++ b/vitragedashboard/enabled/_92_project_entities_vitrage_panel.py
@@ -0,0 +1,27 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# The name of the panel to be added to HORIZON_CONFIG. Required.
+PANEL = 'alarms_vitrage_panel'
+# The name of the dashboard the PANEL associated with. Required.
+PANEL_DASHBOARD = 'project'
+# The name of the panel group the PANEL is associated with.
+PANEL_GROUP = 'vitrage_panel_group'
+
+# Python panel class of the PANEL to be added.
+ADD_PANEL = 'vitrageentities.panel.EntitiesVitrage'
+
+ADD_INSTALLED_APPS = ['vitrageentities']
+
+ADD_ANGULAR_MODULES = ['horizon.dashboard.project.vitrage']
+
+AUTO_DISCOVER_STATIC_FILES = True
diff --git a/vitragedashboard/static/app/core/openstack-service-api/vitrage.service.js b/vitragedashboard/static/app/core/openstack-service-api/vitrage.service.js
new file mode 100644
index 0000000..e995bfa
--- /dev/null
+++ b/vitragedashboard/static/app/core/openstack-service-api/vitrage.service.js
@@ -0,0 +1,35 @@
+
+(function () {
+ 'use strict';
+
+ angular
+ .module('horizon.app.core.openstack-service-api')
+ .factory('horizon.app.core.openstack-service-api.vitrage', vitrageAPI);
+
+ vitrageAPI.$inject = [
+ 'horizon.framework.util.http.service',
+ 'horizon.framework.widgets.toast.service'
+ ];
+
+ function vitrageAPI(apiService, toastService) {
+
+ return {
+ getTopology: getTopology
+ };
+
+ ///////////
+
+ // Topology
+ function getTopology() {
+ console.log("**** getToplogy test ****");
+ return apiService.get('/api/nova/keypairs/')
+ .error(function () {
+ toastService.add('error', gettext('Unable to get the Vitrage service Topology.'));
+ });
+
+ }
+
+
+ }
+
+}());
diff --git a/vitragedashboard/static/app/core/openstack-service-api/vitrage.service.spec.js b/vitragedashboard/static/app/core/openstack-service-api/vitrage.service.spec.js
new file mode 100644
index 0000000..c8832d7
--- /dev/null
+++ b/vitragedashboard/static/app/core/openstack-service-api/vitrage.service.spec.js
@@ -0,0 +1,63 @@
+/*
+ * (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function() {
+ 'use strict';
+
+ describe('Vitrage API', function() {
+ var testCall, service;
+ var apiService = {};
+ var toastService = {};
+
+ beforeEach(
+ module('horizon.mock.openstack-service-api',
+ function($provide, initServices) {
+ testCall = initServices($provide, apiService, toastService);
+ })
+ );
+
+ beforeEach(module('horizon.app.core.openstack-service-api'));
+
+ beforeEach(inject(['horizon.app.core.openstack-service-api.vitrage', function(vitrageAPI) {
+ service = vitrageAPI;
+ }]));
+
+ it('defines the service', function() {
+ expect(service).toBeDefined();
+ });
+
+ var tests = [
+ {
+ "func": "getTopology",
+ "method": "get",
+ "path": "/api/vitrage/topology/",
+ "error": "Unable to get the Vitrage service topology."
+ }
+
+ ];
+
+ // Iterate through the defined tests and apply as Jasmine specs.
+ //noinspection JSCheckFunctionSignatures
+ angular.forEach(tests, function(params) {
+ it('defines the ' + params.func + ' call properly', function() {
+ var callParams = [apiService, service, toastService, params];
+ testCall.apply(this, callParams);
+ });
+ });
+
+ });
+
+})();
diff --git a/vitragedashboard/static/dashboard/project/topology/graph.json b/vitragedashboard/static/dashboard/project/topology/graph.json
new file mode 100644
index 0000000..6a84a29
--- /dev/null
+++ b/vitragedashboard/static/dashboard/project/topology/graph.json
@@ -0,0 +1,380 @@
+{
+ "name": "flare",
+ "children": [
+ {
+ "name": "analytics",
+ "children": [
+ {
+ "name": "cluster",
+ "children": [
+ {"name": "AgglomerativeCluster", "size": 3938},
+ {"name": "CommunityStructure", "size": 3812},
+ {"name": "HierarchicalCluster", "size": 6714},
+ {"name": "MergeEdge", "size": 743}
+ ]
+ },
+ {
+ "name": "graph",
+ "children": [
+ {"name": "BetweennessCentrality", "size": 3534},
+ {"name": "LinkDistance", "size": 5731},
+ {"name": "MaxFlowMinCut", "size": 7840},
+ {"name": "ShortestPaths", "size": 5914},
+ {"name": "SpanningTree", "size": 3416}
+ ]
+ },
+ {
+ "name": "optimization",
+ "children": [
+ {"name": "AspectRatioBanker", "size": 7074}
+ ]
+ }
+ ]
+ },
+ {
+ "name": "animate",
+ "children": [
+ {"name": "Easing", "size": 17010},
+ {"name": "FunctionSequence", "size": 5842},
+ {
+ "name": "interpolate",
+ "children": [
+ {"name": "ArrayInterpolator", "size": 1983},
+ {"name": "ColorInterpolator", "size": 2047},
+ {"name": "DateInterpolator", "size": 1375},
+ {"name": "Interpolator", "size": 8746},
+ {"name": "MatrixInterpolator", "size": 2202},
+ {"name": "NumberInterpolator", "size": 1382},
+ {"name": "ObjectInterpolator", "size": 1629},
+ {"name": "PointInterpolator", "size": 1675},
+ {"name": "RectangleInterpolator", "size": 2042}
+ ]
+ },
+ {"name": "ISchedulable", "size": 1041},
+ {"name": "Parallel", "size": 5176},
+ {"name": "Pause", "size": 449},
+ {"name": "Scheduler", "size": 5593},
+ {"name": "Sequence", "size": 5534},
+ {"name": "Transition", "size": 9201},
+ {"name": "Transitioner", "size": 19975},
+ {"name": "TransitionEvent", "size": 1116},
+ {"name": "Tween", "size": 6006}
+ ]
+ },
+ {
+ "name": "data",
+ "children": [
+ {
+ "name": "converters",
+ "children": [
+ {"name": "Converters", "size": 721},
+ {"name": "DelimitedTextConverter", "size": 4294},
+ {"name": "GraphMLConverter", "size": 9800},
+ {"name": "IDataConverter", "size": 1314},
+ {"name": "JSONConverter", "size": 2220}
+ ]
+ },
+ {"name": "DataField", "size": 1759},
+ {"name": "DataSchema", "size": 2165},
+ {"name": "DataSet", "size": 586},
+ {"name": "DataSource", "size": 3331},
+ {"name": "DataTable", "size": 772},
+ {"name": "DataUtil", "size": 3322}
+ ]
+ },
+ {
+ "name": "display",
+ "children": [
+ {"name": "DirtySprite", "size": 8833},
+ {"name": "LineSprite", "size": 1732},
+ {"name": "RectSprite", "size": 3623},
+ {"name": "TextSprite", "size": 10066}
+ ]
+ },
+ {
+ "name": "flex",
+ "children": [
+ {"name": "FlareVis", "size": 4116}
+ ]
+ },
+ {
+ "name": "physics",
+ "children": [
+ {"name": "DragForce", "size": 1082},
+ {"name": "GravityForce", "size": 1336},
+ {"name": "IForce", "size": 319},
+ {"name": "NBodyForce", "size": 10498},
+ {"name": "Particle", "size": 2822},
+ {"name": "Simulation", "size": 9983},
+ {"name": "Spring", "size": 2213},
+ {"name": "SpringForce", "size": 1681}
+ ]
+ },
+ {
+ "name": "query",
+ "children": [
+ {"name": "AggregateExpression", "size": 1616},
+ {"name": "And", "size": 1027},
+ {"name": "Arithmetic", "size": 3891},
+ {"name": "Average", "size": 891},
+ {"name": "BinaryExpression", "size": 2893},
+ {"name": "Comparison", "size": 5103},
+ {"name": "CompositeExpression", "size": 3677},
+ {"name": "Count", "size": 781},
+ {"name": "DateUtil", "size": 4141},
+ {"name": "Distinct", "size": 933},
+ {"name": "Expression", "size": 5130},
+ {"name": "ExpressionIterator", "size": 3617},
+ {"name": "Fn", "size": 3240},
+ {"name": "If", "size": 2732},
+ {"name": "IsA", "size": 2039},
+ {"name": "Literal", "size": 1214},
+ {"name": "Match", "size": 3748},
+ {"name": "Maximum", "size": 843},
+ {
+ "name": "methods",
+ "children": [
+ {"name": "add", "size": 593},
+ {"name": "and", "size": 330},
+ {"name": "average", "size": 287},
+ {"name": "count", "size": 277},
+ {"name": "distinct", "size": 292},
+ {"name": "div", "size": 595},
+ {"name": "eq", "size": 594},
+ {"name": "fn", "size": 460},
+ {"name": "gt", "size": 603},
+ {"name": "gte", "size": 625},
+ {"name": "iff", "size": 748},
+ {"name": "isa", "size": 461},
+ {"name": "lt", "size": 597},
+ {"name": "lte", "size": 619},
+ {"name": "max", "size": 283},
+ {"name": "min", "size": 283},
+ {"name": "mod", "size": 591},
+ {"name": "mul", "size": 603},
+ {"name": "neq", "size": 599},
+ {"name": "not", "size": 386},
+ {"name": "or", "size": 323},
+ {"name": "orderby", "size": 307},
+ {"name": "range", "size": 772},
+ {"name": "select", "size": 296},
+ {"name": "stddev", "size": 363},
+ {"name": "sub", "size": 600},
+ {"name": "sum", "size": 280},
+ {"name": "update", "size": 307},
+ {"name": "variance", "size": 335},
+ {"name": "where", "size": 299},
+ {"name": "xor", "size": 354},
+ {"name": "_", "size": 264}
+ ]
+ },
+ {"name": "Minimum", "size": 843},
+ {"name": "Not", "size": 1554},
+ {"name": "Or", "size": 970},
+ {"name": "Query", "size": 13896},
+ {"name": "Range", "size": 1594},
+ {"name": "StringUtil", "size": 4130},
+ {"name": "Sum", "size": 791},
+ {"name": "Variable", "size": 1124},
+ {"name": "Variance", "size": 1876},
+ {"name": "Xor", "size": 1101}
+ ]
+ },
+ {
+ "name": "scale",
+ "children": [
+ {"name": "IScaleMap", "size": 2105},
+ {"name": "LinearScale", "size": 1316},
+ {"name": "LogScale", "size": 3151},
+ {"name": "OrdinalScale", "size": 3770},
+ {"name": "QuantileScale", "size": 2435},
+ {"name": "QuantitativeScale", "size": 4839},
+ {"name": "RootScale", "size": 1756},
+ {"name": "Scale", "size": 4268},
+ {"name": "ScaleType", "size": 1821},
+ {"name": "TimeScale", "size": 5833}
+ ]
+ },
+ {
+ "name": "util",
+ "children": [
+ {"name": "Arrays", "size": 8258},
+ {"name": "Colors", "size": 10001},
+ {"name": "Dates", "size": 8217},
+ {"name": "Displays", "size": 12555},
+ {"name": "Filter", "size": 2324},
+ {"name": "Geometry", "size": 10993},
+ {
+ "name": "heap",
+ "children": [
+ {"name": "FibonacciHeap", "size": 9354},
+ {"name": "HeapNode", "size": 1233}
+ ]
+ },
+ {"name": "IEvaluable", "size": 335},
+ {"name": "IPredicate", "size": 383},
+ {"name": "IValueProxy", "size": 874},
+ {
+ "name": "math",
+ "children": [
+ {"name": "DenseMatrix", "size": 3165},
+ {"name": "IMatrix", "size": 2815},
+ {"name": "SparseMatrix", "size": 3366}
+ ]
+ },
+ {"name": "Maths", "size": 17705},
+ {"name": "Orientation", "size": 1486},
+ {
+ "name": "palette",
+ "children": [
+ {"name": "ColorPalette", "size": 6367},
+ {"name": "Palette", "size": 1229},
+ {"name": "ShapePalette", "size": 2059},
+ {"name": "SizePalette", "size": 2291}
+ ]
+ },
+ {"name": "Property", "size": 5559},
+ {"name": "Shapes", "size": 19118},
+ {"name": "Sort", "size": 6887},
+ {"name": "Stats", "size": 6557},
+ {"name": "Strings", "size": 22026}
+ ]
+ },
+ {
+ "name": "vis",
+ "children": [
+ {
+ "name": "axis",
+ "children": [
+ {"name": "Axes", "size": 1302},
+ {"name": "Axis", "size": 24593},
+ {"name": "AxisGridLine", "size": 652},
+ {"name": "AxisLabel", "size": 636},
+ {"name": "CartesianAxes", "size": 6703}
+ ]
+ },
+ {
+ "name": "controls",
+ "children": [
+ {"name": "AnchorControl", "size": 2138},
+ {"name": "ClickControl", "size": 3824},
+ {"name": "Control", "size": 1353},
+ {"name": "ControlList", "size": 4665},
+ {"name": "DragControl", "size": 2649},
+ {"name": "ExpandControl", "size": 2832},
+ {"name": "HoverControl", "size": 4896},
+ {"name": "IControl", "size": 763},
+ {"name": "PanZoomControl", "size": 5222},
+ {"name": "SelectionControl", "size": 7862},
+ {"name": "TooltipControl", "size": 8435}
+ ]
+ },
+ {
+ "name": "data",
+ "children": [
+ {"name": "Data", "size": 20544},
+ {"name": "DataList", "size": 19788},
+ {"name": "DataSprite", "size": 10349},
+ {"name": "EdgeSprite", "size": 3301},
+ {"name": "NodeSprite", "size": 19382},
+ {
+ "name": "render",
+ "children": [
+ {"name": "ArrowType", "size": 698},
+ {"name": "EdgeRenderer", "size": 5569},
+ {"name": "IRenderer", "size": 353},
+ {"name": "ShapeRenderer", "size": 2247}
+ ]
+ },
+ {"name": "ScaleBinding", "size": 11275},
+ {"name": "Tree", "size": 7147},
+ {"name": "TreeBuilder", "size": 9930}
+ ]
+ },
+ {
+ "name": "events",
+ "children": [
+ {"name": "DataEvent", "size": 2313},
+ {"name": "SelectionEvent", "size": 1880},
+ {"name": "TooltipEvent", "size": 1701},
+ {"name": "VisualizationEvent", "size": 1117}
+ ]
+ },
+ {
+ "name": "legend",
+ "children": [
+ {"name": "Legend", "size": 20859},
+ {"name": "LegendItem", "size": 4614},
+ {"name": "LegendRange", "size": 10530}
+ ]
+ },
+ {
+ "name": "operator",
+ "children": [
+ {
+ "name": "distortion",
+ "children": [
+ {"name": "BifocalDistortion", "size": 4461},
+ {"name": "Distortion", "size": 6314},
+ {"name": "FisheyeDistortion", "size": 3444}
+ ]
+ },
+ {
+ "name": "encoder",
+ "children": [
+ {"name": "ColorEncoder", "size": 3179},
+ {"name": "Encoder", "size": 4060},
+ {"name": "PropertyEncoder", "size": 4138},
+ {"name": "ShapeEncoder", "size": 1690},
+ {"name": "SizeEncoder", "size": 1830}
+ ]
+ },
+ {
+ "name": "filter",
+ "children": [
+ {"name": "FisheyeTreeFilter", "size": 5219},
+ {"name": "GraphDistanceFilter", "size": 3165},
+ {"name": "VisibilityFilter", "size": 3509}
+ ]
+ },
+ {"name": "IOperator", "size": 1286},
+ {
+ "name": "label",
+ "children": [
+ {"name": "Labeler", "size": 9956},
+ {"name": "RadialLabeler", "size": 3899},
+ {"name": "StackedAreaLabeler", "size": 3202}
+ ]
+ },
+ {
+ "name": "layout",
+ "children": [
+ {"name": "AxisLayout", "size": 6725},
+ {"name": "BundledEdgeRouter", "size": 3727},
+ {"name": "CircleLayout", "size": 9317},
+ {"name": "CirclePackingLayout", "size": 12003},
+ {"name": "DendrogramLayout", "size": 4853},
+ {"name": "ForceDirectedLayout", "size": 8411},
+ {"name": "IcicleTreeLayout", "size": 4864},
+ {"name": "IndentedTreeLayout", "size": 3174},
+ {"name": "Layout", "size": 7881},
+ {"name": "NodeLinkTreeLayout", "size": 12870},
+ {"name": "PieLayout", "size": 2728},
+ {"name": "RadialTreeLayout", "size": 12348},
+ {"name": "RandomLayout", "size": 870},
+ {"name": "StackedAreaLayout", "size": 9121},
+ {"name": "TreeMapLayout", "size": 9191}
+ ]
+ },
+ {"name": "Operator", "size": 2490},
+ {"name": "OperatorList", "size": 5248},
+ {"name": "OperatorSequence", "size": 4190},
+ {"name": "OperatorSwitch", "size": 2581},
+ {"name": "SortOperator", "size": 2023}
+ ]
+ },
+ {"name": "Visualization", "size": 16540}
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/vitrageentities/__init__.py b/vitrageentities/__init__.py
new file mode 100644
index 0000000..c5c0d10
--- /dev/null
+++ b/vitrageentities/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import pbr.version
+
+
+__version__ = pbr.version.VersionInfo(
+ 'vitrageentities').version_string()
diff --git a/vitrageentities/panel.py b/vitrageentities/panel.py
new file mode 100644
index 0000000..f66d879
--- /dev/null
+++ b/vitrageentities/panel.py
@@ -0,0 +1,22 @@
+# Copyright 2015 IBM Corp.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+
+
+class EntitiesVitrage(horizon.Panel):
+ name = _("Entities")
+ slug = "vitrageentities"
diff --git a/vitrageentities/templates/entities/index.html b/vitrageentities/templates/entities/index.html
new file mode 100644
index 0000000..283088f
--- /dev/null
+++ b/vitrageentities/templates/entities/index.html
@@ -0,0 +1,15 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block title %}{% trans "Topology" %}{% endblock %}
+
+{% block page_header %}
+
+{% endblock page_header %}
+
+{% block main %}
+
+
+
+
+{% endblock %}
+
diff --git a/vitrageentities/urls.py b/vitrageentities/urls.py
new file mode 100644
index 0000000..280cfee
--- /dev/null
+++ b/vitrageentities/urls.py
@@ -0,0 +1,22 @@
+# Copyright 2015 IBM Corp.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from django.conf import urls
+
+from vitrageentities import views
+
+urlpatterns = urls.patterns(
+ '',
+ urls.url(r'^$', views.IndexView.as_view(), name='index'),
+)
diff --git a/vitrageentities/version.py b/vitrageentities/version.py
new file mode 100644
index 0000000..1b61796
--- /dev/null
+++ b/vitrageentities/version.py
@@ -0,0 +1,15 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import pbr.version
+
+version_info = pbr.version.VersionInfo('vitrage_entities_ui')
diff --git a/vitrageentities/views.py b/vitrageentities/views.py
new file mode 100644
index 0000000..2165e50
--- /dev/null
+++ b/vitrageentities/views.py
@@ -0,0 +1,32 @@
+# Copyright 2012 Alcatel-Lucent, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon import views
+
+import json
+
+
+class IndexView(views.APIView):
+ # A very simple class-based view...
+ template_name = 'entities/index.html'
+
+ def get_data(self, request, context, *args, **kwargs):
+ topology_settings = {
+ 'VITRAGE_VERSION': {
+ 'VER': 1,
+ 'REL': 1
+ }
+ }
+ context['TOPOLOGY_VITRAGE_SETTINGS'] = json.dumps(topology_settings)
+ return context