Merge branch 'master' of github.com:open-cloud/xos
diff --git a/views/ngXosViews/diagnostic/src/css/diagnostic.css b/views/ngXosViews/diagnostic/src/css/diagnostic.css
index d9d1470..5db9d7f 100644
--- a/views/ngXosViews/diagnostic/src/css/diagnostic.css
+++ b/views/ngXosViews/diagnostic/src/css/diagnostic.css
@@ -105,6 +105,10 @@
stroke-width: 1px;
}
+logic-topology .compute-node > text{
+ font-size: 16px;
+}
+
/* INSTANCE */
logic-topology .instance > rect{
@@ -203,6 +207,10 @@
}
.node text {
+ font: 18px sans-serif;
+}
+
+.node .instance text {
font: 12px sans-serif;
}
diff --git a/views/ngXosViews/diagnostic/src/js/chart_data_service.js b/views/ngXosViews/diagnostic/src/js/chart_data_service.js
index 5d65b2b..ff2d31b 100644
--- a/views/ngXosViews/diagnostic/src/js/chart_data_service.js
+++ b/views/ngXosViews/diagnostic/src/js/chart_data_service.js
@@ -81,6 +81,10 @@
serviceTopologyConfig.elWidths.pop();
}
+ //remove tags and ip
+ delete this.logicTopologyData.children[0].children[0].children[0].subscriberTag;
+ delete this.logicTopologyData.children[0].subscriberIP;
+
this.highlightInstances([]);
delete this.logicTopologyData.children[0].children[0].children[0].children[0].children;
}
diff --git a/views/ngXosViews/diagnostic/src/js/logicTopology.js b/views/ngXosViews/diagnostic/src/js/logicTopology.js
index f88b80a..5ab5d0f 100644
--- a/views/ngXosViews/diagnostic/src/js/logicTopology.js
+++ b/views/ngXosViews/diagnostic/src/js/logicTopology.js
@@ -17,6 +17,7 @@
var svg;
this.selectedInstances = [];
this.hideInstanceStats = true;
+ var _this = this;
const handleSvg = (el) => {
@@ -61,6 +62,12 @@
.then((instances) => {
LogicTopologyHelper.updateTree(svg);
})
+ .catch(e => {
+ _this.error = 'Service statistics are not available at this time. Please try again later.'
+ $timeout(() => {
+ _this.error = null;
+ }, 2000);
+ })
});
d3.select(window)
diff --git a/views/ngXosViews/diagnostic/src/js/nodeDrawer.js b/views/ngXosViews/diagnostic/src/js/nodeDrawer.js
index 7649374..514f114 100644
--- a/views/ngXosViews/diagnostic/src/js/nodeDrawer.js
+++ b/views/ngXosViews/diagnostic/src/js/nodeDrawer.js
@@ -14,10 +14,14 @@
var _this = this;
this.addNetworks = (nodes) => {
+
+ // clean childs
+ nodes.selectAll('*').remove();
+
nodes.append('path')
.attr({
d: shapes.cloud,
- transform: 'translate(-63, -52), scale(0.5)',
+ transform: 'translate(-100, -72), scale(0.7)',
class: 'cloud'
});
@@ -45,14 +49,14 @@
currentNode.append('text')
.attr({
'text-anchor': 'middle',
- y: 40
+ y: 50
})
.text(() => `C-Tag: ${n.subscriberTag.cTag}`);
currentNode.append('text')
.attr({
'text-anchor': 'middle',
- y: 60
+ y: 70
})
.text(() => `S-Tag: ${n.subscriberTag.sTag}`);
}
@@ -61,7 +65,7 @@
currentNode.append('text')
.attr({
'text-anchor': 'middle',
- y: 40
+ y: 50
})
.text(() => `Public IP: ${n.subscriberIP}`);
}
@@ -164,7 +168,7 @@
nodeContainer.append('text')
.attr({
'text-anchor': 'start',
- y: 15, //FIXME
+ y: 17, //FIXME
x: 10, //FIXME
opacity: 0
})
@@ -370,10 +374,10 @@
statsContainer.append('line')
.attr({
- x1: d => lines[d.humanReadableName].x1 || lines['mysite_vsg-1'],
- y1: d => lines[d.humanReadableName].y1 || lines['mysite_vsg-1'],
- x2: d => lines[d.humanReadableName].x2 || lines['mysite_vsg-1'],
- y2: d => lines[d.humanReadableName].y2 || lines['mysite_vsg-1'],
+ x1: d => lines[d.humanReadableName].x1 || lines['mysite_vsg-1'].x1,
+ y1: d => lines[d.humanReadableName].y1 || lines['mysite_vsg-1'].y1,
+ x2: d => lines[d.humanReadableName].x2 || lines['mysite_vsg-1'].x2,
+ y2: d => lines[d.humanReadableName].y2 || lines['mysite_vsg-1'].y2,
stroke: 'black',
opacity: 0
})
diff --git a/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js b/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
index 61ec1e2..bb7ba5d 100644
--- a/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
+++ b/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
@@ -71,8 +71,13 @@
nodeEnter.append('text')
.attr({
- x: d => d.children ? -serviceTopologyConfig.circle.selectedRadius -3 : serviceTopologyConfig.circle.selectedRadius + 3,
+ x: d => d.children ? -serviceTopologyConfig.circle.selectedRadius -5 : serviceTopologyConfig.circle.selectedRadius + 5,
dy: '.35em',
+ y: d => {
+ if (d.children && d.parent){
+ return '-5';
+ }
+ },
transform: d => {
if (d.children && d.parent){
if(d.parent.x < d.x){
diff --git a/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html b/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html
index 8c81015..e942fca 100644
--- a/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html
+++ b/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html
@@ -1,6 +1,9 @@
<select-subscriber-modal open="vm.openSelectSubscriberModal" subscribers="vm.subscribers"></select-subscriber-modal>
<subscriber-status-modal open="vm.openSubscriberStatusModal" subscriber="vm.currentSubscriber"></subscriber-status-modal>
-<div class="instances-stats animate" ng-hide="vm.hideInstanceStats">
+<div class="alert alert-danger animate" ng-hide="!vm.error">
+ {{vm.error}}
+</div>
+<!-- <div class="instances-stats animate" ng-hide="vm.hideInstanceStats">
<div class="row">
<div class="col-sm-3 col-sm-offset-8">
<div class="panel panel-primary" ng-repeat="instance in vm.selectedInstances">
@@ -21,4 +24,4 @@
</div>
</div>
</div>
-</div>
\ No newline at end of file
+</div> -->
\ No newline at end of file
diff --git a/xos/configurations/cord-pod/cdn/README.md b/xos/configurations/cord-pod/cdn/README.md
index a7730f9..af5b38d 100644
--- a/xos/configurations/cord-pod/cdn/README.md
+++ b/xos/configurations/cord-pod/cdn/README.md
@@ -65,3 +65,4 @@
## Restart CDN after power-down
To do...
+test
diff --git a/xos/core/xoslib/static/css/xosDiagnostic.css b/xos/core/xoslib/static/css/xosDiagnostic.css
index b5fb8d6..0c1de20 100644
--- a/xos/core/xoslib/static/css/xosDiagnostic.css
+++ b/xos/core/xoslib/static/css/xosDiagnostic.css
@@ -1 +1 @@
-#xosDiagnostic,[ui-view]{min-height:700px;position:relative}diagnostic-container .form-control.small-padding{padding:6px}diagnostic-container .half-height{position:relative;height:50%}diagnostic-container .onethird-height{position:relative;height:33%;border-bottom:1px solid #999}diagnostic-container .twothird-height{position:relative;height:67%}diagnostic-container .subscriber-select{max-width:200px;position:absolute;top:20px;right:20px;z-index:1}diagnostic-container .onethird-height .well,diagnostic-container .twothird-height .well{font-weight:700;max-width:165px;text-align:center;margin-top:15px;background:#eee;border-color:steelblue;padding:10px}diagnostic-container .onethird-height .well.pull-right{position:absolute;right:0;top:-15px;cursor:pointer;z-index:200}subscriber-status-modal .row+.row{margin-top:20px}.half-height+.half-height{border-top:1px solid black}service-topology,logic-topology{height:100%;width:100%;display:block;position:absolute;top:0}logic-topology .subscriber circle,logic-topology .device circle{fill:#fff;stroke:green;stroke-width:1px}logic-topology>svg{position:absolute;top:0}logic-topology .network .cloud{fill:#fff;stroke:green;stroke-width:1px}logic-topology .node.rack>g>rect{fill:#ccc;stroke:steelblue;stroke-width:1px}logic-topology .compute-node>rect{fill:#fff;stroke:steelblue;stroke-width:1px}logic-topology .instance>rect{fill:#eee;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active rect{fill:lightsteelblue;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active.good>rect{fill:green}logic-topology .node .instance.active.provisioning>rect{fill:yellow}logic-topology .node .instance.active.bad>rect{fill:red}logic-topology .node .instance .stats-container rect{fill:white}logic-topology .node .instance .stats-container text.name{font-weight:700}logic-topology .node .instance .stats-container text.ip{font-style:italic;font-size:10px}logic-topology .node .instance .stats-container .container rect{fill:#eee;stroke:steelblue;stroke-width:1px}.legend{fill:#fff;stroke:#ccc;stroke-width:1px;position:relative}.legend text{stroke:#000}.node{cursor:pointer}.node circle,.node rect{fill:#fff;stroke:steelblue;stroke-width:1px}.node.subscriber circle,.node.subscriber rect,.node.router circle,.node.router rect{stroke:#05ffcb}.node.slice rect{stroke:#b01dff}.node.instance rect{stroke:#ccc}.node.instance rect.active{stroke:#ff8b00}.node rect.slice-detail{fill:#fff;stroke:steelblue;stroke-width:3px}.node text{font:12px sans-serif}.node text.small{font-size:10px}.link,.device-link{fill:none;stroke:#ccc;stroke-width:2px}.link.slice{stroke:rgba(157,4,183,.29)}.link.instance{stroke:#ccc}.link.instance.active{stroke:rgba(255,138,0,.65)}.service-details{width:200px;position:absolute;top:20px;right:20px}.animate.ng-hide-remove{animation:.5s bounceInRight ease}.animate.ng-hide-add{animation:.5s bounceOutRight ease}.loader{font-size:10px;margin:150px auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:linear-gradient(to right,#fff 10%,rgba(255,255,255,0) 42%);position:relative;animation:load3 1.4s infinite linear;transform:translateZ(0)}.loader:before{width:50%;height:50%;background:#105e9e;border-radius:100% 0 0;position:absolute;top:0;left:0;content:''}.loader:after{background:#fff;width:75%;height:75%;border-radius:50%;content:'';margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}@keyframes load3{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.modal.fade.in{display:block}@keyframes bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1.000)}from{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}
\ No newline at end of file
+#xosDiagnostic,[ui-view]{min-height:700px;position:relative}diagnostic-container .form-control.small-padding{padding:6px}diagnostic-container .half-height{position:relative;height:50%}diagnostic-container .onethird-height{position:relative;height:33%;border-bottom:1px solid #999}diagnostic-container .twothird-height{position:relative;height:67%}diagnostic-container .subscriber-select{max-width:200px;position:absolute;top:20px;right:20px;z-index:1}diagnostic-container .onethird-height .well,diagnostic-container .twothird-height .well{font-weight:700;max-width:165px;text-align:center;margin-top:15px;background:#eee;border-color:steelblue;padding:10px}diagnostic-container .onethird-height .well.pull-right{position:absolute;right:0;top:-15px;cursor:pointer;z-index:200}subscriber-status-modal .row+.row{margin-top:20px}.half-height+.half-height{border-top:1px solid black}service-topology,logic-topology{height:100%;width:100%;display:block;position:absolute;top:0}logic-topology .subscriber circle,logic-topology .device circle{fill:#fff;stroke:green;stroke-width:1px}logic-topology>svg{position:absolute;top:0}logic-topology .network .cloud{fill:#fff;stroke:green;stroke-width:1px}logic-topology .node.rack>g>rect{fill:#ccc;stroke:steelblue;stroke-width:1px}logic-topology .compute-node>rect{fill:#fff;stroke:steelblue;stroke-width:1px}logic-topology .compute-node>text{font-size:16px}logic-topology .instance>rect{fill:#eee;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active rect{fill:lightsteelblue;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active.good>rect{fill:green}logic-topology .node .instance.active.provisioning>rect{fill:yellow}logic-topology .node .instance.active.bad>rect{fill:red}logic-topology .node .instance .stats-container rect{fill:white}logic-topology .node .instance .stats-container text.name{font-weight:700}logic-topology .node .instance .stats-container text.ip{font-style:italic;font-size:10px}logic-topology .node .instance .stats-container .container rect{fill:#eee;stroke:steelblue;stroke-width:1px}.legend{fill:#fff;stroke:#ccc;stroke-width:1px;position:relative}.legend text{stroke:#000}.node{cursor:pointer}.node circle,.node rect{fill:#fff;stroke:steelblue;stroke-width:1px}.node.subscriber circle,.node.subscriber rect,.node.router circle,.node.router rect{stroke:#05ffcb}.node.slice rect{stroke:#b01dff}.node.instance rect{stroke:#ccc}.node.instance rect.active{stroke:#ff8b00}.node rect.slice-detail{fill:#fff;stroke:steelblue;stroke-width:3px}.node text{font:18px sans-serif}.node .instance text{font:12px sans-serif}.node text.small{font-size:10px}.link,.device-link{fill:none;stroke:#ccc;stroke-width:2px}.link.slice{stroke:rgba(157,4,183,.29)}.link.instance{stroke:#ccc}.link.instance.active{stroke:rgba(255,138,0,.65)}.service-details{width:200px;position:absolute;top:20px;right:20px}.animate.ng-hide-remove{animation:.5s bounceInRight ease}.animate.ng-hide-add{animation:.5s bounceOutRight ease}.loader{font-size:10px;margin:150px auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:linear-gradient(to right,#fff 10%,rgba(255,255,255,0) 42%);position:relative;animation:load3 1.4s infinite linear;transform:translateZ(0)}.loader:before{width:50%;height:50%;background:#105e9e;border-radius:100% 0 0;position:absolute;top:0;left:0;content:''}.loader:after{background:#fff;width:75%;height:75%;border-radius:50%;content:'';margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}@keyframes load3{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.modal.fade.in{display:block}@keyframes bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1.000)}from{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}
\ No newline at end of file
diff --git a/xos/core/xoslib/static/js/xosDiagnostic.js b/xos/core/xoslib/static/js/xosDiagnostic.js
index 2c46d49..4e4def0 100644
--- a/xos/core/xoslib/static/js/xosDiagnostic.js
+++ b/xos/core/xoslib/static/js/xosDiagnostic.js
@@ -16,7 +16,7 @@
}]);
})();
angular.module("xos.diagnostic").run(["$templateCache", function($templateCache) {$templateCache.put("templates/diagnostic.tpl.html","<div class=\"container-fluid\">\n <div ng-hide=\"vm.error && vm.loader\" style=\"height: 900px\">\n <div class=\"onethird-height\">\n <div class=\"well\">\n Services Graph\n </div>\n <div class=\"well pull-right\" ng-click=\"vm.reloadGlobalScope()\" ng-show=\"vm.selectedSubscriber\">\n Reset subscriber\n </div>\n <service-topology service-chain=\"vm.serviceChain\"></service-topology>\n </div>\n <div class=\"twothird-height\">\n <div class=\"well\">\n Logical Resources\n </div>\n <logic-topology ng-if=\"vm.subscribers\" subscribers=\"vm.subscribers\" selected=\"vm.selectedSubscriber\"></logic-topology>\n </div>\n </div>\n <div class=\"row\" ng-if=\"vm.error\">\n <div class=\"col-xs-12\">\n <div class=\"alert alert-danger\">\n {{vm.error}}\n </div>\n </div>\n </div>\n <div class=\"row\" ng-if=\"vm.loader\">\n <div class=\"col-xs-12\">\n <div class=\"loader\">Loading</div>\n </div>\n </div>\n</div>");
-$templateCache.put("templates/logicTopology.tpl.html","<select-subscriber-modal open=\"vm.openSelectSubscriberModal\" subscribers=\"vm.subscribers\"></select-subscriber-modal>\n<subscriber-status-modal open=\"vm.openSubscriberStatusModal\" subscriber=\"vm.currentSubscriber\"></subscriber-status-modal>\n<div class=\"instances-stats animate\" ng-hide=\"vm.hideInstanceStats\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-sm-offset-8\">\n <div class=\"panel panel-primary\" ng-repeat=\"instance in vm.selectedInstances\">\n <div class=\"panel-heading\">\n {{instance.humanReadableName}}\n </div>\n <ul class=\"list-group\">\n <li class=\"list-group-item\">Backend Status: {{instance.backend_status}}</li>\n <li class=\"list-group-item\">IP Address: {{instance.ip}}</li>\n </ul>\n <ul class=\"list-group\">\n <li class=\"list-group-item\" ng-repeat=\"stat in instance.stats\">\n <span class=\"badge\">{{stat.value}}</span>\n {{stat.meter}}\n </li>\n </ul>\n </div>\n </div> \n </div>\n </div>\n</div>");
+$templateCache.put("templates/logicTopology.tpl.html","<select-subscriber-modal open=\"vm.openSelectSubscriberModal\" subscribers=\"vm.subscribers\"></select-subscriber-modal>\n<subscriber-status-modal open=\"vm.openSubscriberStatusModal\" subscriber=\"vm.currentSubscriber\"></subscriber-status-modal>\n<div class=\"alert alert-danger animate\" ng-hide=\"!vm.error\">\n {{vm.error}}\n</div>\n<!-- <div class=\"instances-stats animate\" ng-hide=\"vm.hideInstanceStats\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-sm-offset-8\">\n <div class=\"panel panel-primary\" ng-repeat=\"instance in vm.selectedInstances\">\n <div class=\"panel-heading\">\n {{instance.humanReadableName}}\n </div>\n <ul class=\"list-group\">\n <li class=\"list-group-item\">Backend Status: {{instance.backend_status}}</li>\n <li class=\"list-group-item\">IP Address: {{instance.ip}}</li>\n </ul>\n <ul class=\"list-group\">\n <li class=\"list-group-item\" ng-repeat=\"stat in instance.stats\">\n <span class=\"badge\">{{stat.value}}</span>\n {{stat.meter}}\n </li>\n </ul>\n </div>\n </div> \n </div>\n </div>\n</div> -->");
$templateCache.put("templates/select-subscriber-modal.tpl.html","<div class=\"modal fade\" ng-class=\"{in: vm.open}\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-sm\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button ng-click=\"vm.close()\" type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n <h4 class=\"modal-title\">Select a subscriber:</h4>\n </div>\n <div class=\"modal-body\">\n <select class=\"form-control\" ng-options=\"s as s.humanReadableName for s in vm.subscribers\" ng-model=\"vm.selected\"></select>\n </div>\n <div class=\"modal-footer\">\n <button ng-click=\"vm.close()\" type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\n <button ng-click=\"vm.select(vm.selected)\" type=\"button\" class=\"btn btn-primary\">Select</button>\n </div>\n </div><!-- /.modal-content -->\n </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->");
$templateCache.put("templates/subscriber-status-modal.tpl.html","<div class=\"modal fade\" ng-class=\"{in: vm.open}\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-sm\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button ng-click=\"vm.close()\" type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n <h4 class=\"modal-title\">Manage subscriber:</h4>\n </div>\n <form name=\"vm.subscriber-detail\">\n <div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-xs-12\">\n <label>Status</label>\n </div>\n <div class=\"col-xs-6\">\n <a ng-click=\"vm.subscriber.status = \'enabled\'\"\n class=\"btn btn-block\"\n ng-class=\"{\'btn-primary\': vm.subscriber.status === \'enabled\' ,\'btn-default\': vm.subscriber.status !== \'enabled\'}\"\n >Enabled</a>\n </div>\n <div class=\"col-xs-6\">\n <a ng-click=\"vm.subscriber.status = \'suspended\'\"\n class=\"btn btn-block\"\n ng-class=\"{\'btn-primary\': vm.subscriber.status === \'suspended\' ,\'btn-default\': vm.subscriber.status !== \'suspended\'}\"\n >Suspended</a>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <a ng-click=\"vm.subscriber.status = \'delinquent\'\"\n class=\"btn btn-block\"\n ng-class=\"{\'btn-primary\': vm.subscriber.status === \'delinquent\' ,\'btn-default\': vm.subscriber.status !== \'delinquent\'}\"\n >Delinquent <br> payment</a>\n </div>\n <div class=\"col-xs-6\">\n <a ng-click=\"vm.subscriber.status = \'copyrightviolation\'\"\n class=\"btn btn-block\"\n ng-class=\"{\'btn-primary\': vm.subscriber.status === \'copyrightviolation\' ,\'btn-default\': vm.subscriber.status !== \'copyrightviolation\'}\"\n >Copyright <br> violation</a>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <label>Uplink Speed</label>\n <div class=\"input-group\">\n <input type=\"number\" class=\"form-control small-padding\" ng-model=\"vm.subscriber.uplink_speed\"/>\n <span class=\"input-group-addon\">Mbps</span>\n </div>\n </div>\n <div class=\"col-xs-6\">\n <label>Downlink Speed</label>\n <div class=\"input-group\">\n <input type=\"number\" class=\"form-control small-padding\" ng-model=\"vm.subscriber.downlink_speed\"/>\n <span class=\"input-group-addon\">Mbps</span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <label>Enable Internet</label>\n </div>\n <div class=\"col-xs-6\">\n <a \n ng-click=\"vm.subscriber.enable_uverse = !vm.subscriber.enable_uverse\" \n ng-class=\"{\'btn-success\': vm.subscriber.enable_uverse, \'btn-danger\': !vm.subscriber.enable_uverse}\"\n class=\"btn btn-block\">\n <span ng-show=\"vm.subscriber.enable_uverse === true\">Enabled</span>\n <span ng-show=\"vm.subscriber.enable_uverse !== true\">Disabled</span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\" ng-show=\"vm.success || vm.formError\">\n <div class=\"alert alert-success\" ng-show=\"vm.success\">\n {{vm.success}}\n </div>\n <div class=\"alert alert-danger\" ng-show=\"vm.formError\">\n {{vm.formError}}\n </div>\n </div>\n <div class=\"modal-footer\">\n <button ng-click=\"vm.close()\" type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\n <button ng-click=\"vm.updateSubscriber(vm.subscriber)\" type=\"button\" class=\"btn btn-primary\">Save</button>\n </div>\n </form>\n </div><!-- /.modal-content -->\n </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->");}]);
'use strict';
@@ -184,9 +184,14 @@
nodeEnter.append('text').attr({
x: function x(d) {
- return d.children ? -serviceTopologyConfig.circle.selectedRadius - 3 : serviceTopologyConfig.circle.selectedRadius + 3;
+ return d.children ? -serviceTopologyConfig.circle.selectedRadius - 5 : serviceTopologyConfig.circle.selectedRadius + 5;
},
dy: '.35em',
+ y: function y(d) {
+ if (d.children && d.parent) {
+ return '-5';
+ }
+ },
transform: function transform(d) {
if (d.children && d.parent) {
if (d.parent.x < d.x) {
@@ -890,9 +895,13 @@
var _this = this;
this.addNetworks = function (nodes) {
+
+ // clean childs
+ nodes.selectAll('*').remove();
+
nodes.append('path').attr({
d: shapes.cloud,
- transform: 'translate(-63, -52), scale(0.5)',
+ transform: 'translate(-100, -72), scale(0.7)',
'class': 'cloud'
});
@@ -919,14 +928,14 @@
if (n.name === 'LAN-Side' && angular.isDefined(n.subscriberTag)) {
currentNode.append('text').attr({
'text-anchor': 'middle',
- y: 40
+ y: 50
}).text(function () {
return 'C-Tag: ' + n.subscriberTag.cTag;
});
currentNode.append('text').attr({
'text-anchor': 'middle',
- y: 60
+ y: 70
}).text(function () {
return 'S-Tag: ' + n.subscriberTag.sTag;
});
@@ -935,7 +944,7 @@
if (n.name === 'WAN-Side' && angular.isDefined(n.subscriberIP)) {
currentNode.append('text').attr({
'text-anchor': 'middle',
- y: 40
+ y: 50
}).text(function () {
return 'Public IP: ' + n.subscriberIP;
});
@@ -1030,7 +1039,7 @@
nodeContainer.append('text').attr({
'text-anchor': 'start',
- y: 15, //FIXME
+ y: 17, //FIXME
x: 10, //FIXME
opacity: 0
}).text(function (d) {
@@ -1204,16 +1213,16 @@
statsContainer.append('line').attr({
x1: function x1(d) {
- return lines[d.humanReadableName].x1 || lines['mysite_vsg-1'];
+ return lines[d.humanReadableName].x1 || lines['mysite_vsg-1'].x1;
},
y1: function y1(d) {
- return lines[d.humanReadableName].y1 || lines['mysite_vsg-1'];
+ return lines[d.humanReadableName].y1 || lines['mysite_vsg-1'].y1;
},
x2: function x2(d) {
- return lines[d.humanReadableName].x2 || lines['mysite_vsg-1'];
+ return lines[d.humanReadableName].x2 || lines['mysite_vsg-1'].x2;
},
y2: function y2(d) {
- return lines[d.humanReadableName].y2 || lines['mysite_vsg-1'];
+ return lines[d.humanReadableName].y2 || lines['mysite_vsg-1'].y2;
},
stroke: 'black',
opacity: 0
@@ -1575,13 +1584,14 @@
controllerAs: 'vm',
templateUrl: 'templates/logicTopology.tpl.html',
controller: ["$element", "$log", "$scope", "$rootScope", "$timeout", "d3", "LogicTopologyHelper", "Node", "Tenant", "Ceilometer", "serviceTopologyConfig", "ChartData", function controller($element, $log, $scope, $rootScope, $timeout, d3, LogicTopologyHelper, Node, Tenant, Ceilometer, serviceTopologyConfig, ChartData) {
- var _this = this;
+ var _this2 = this;
$log.info('Logic Plane');
var svg;
this.selectedInstances = [];
this.hideInstanceStats = true;
+ var _this = this;
var handleSvg = function handleSvg(el) {
@@ -1598,7 +1608,7 @@
loadGlobalScope();
$scope.$watch(function () {
- return _this.selected;
+ return _this2.selected;
}, function (selected) {
if (selected) {
ChartData.selectSubscriber(selected);
@@ -1610,9 +1620,9 @@
});
$rootScope.$on('instance.detail.hide', function () {
- _this.hideInstanceStats = true;
+ _this2.hideInstanceStats = true;
$timeout(function () {
- _this.selectedInstances = [];
+ _this2.selectedInstances = [];
ChartData.highlightInstances([]);
LogicTopologyHelper.updateTree(svg);
}, 500);
@@ -1621,6 +1631,11 @@
$rootScope.$on('instance.detail', function (evt, service) {
ChartData.getInstanceStatus(service).then(function (instances) {
LogicTopologyHelper.updateTree(svg);
+ })['catch'](function (e) {
+ _this.error = 'Service statistics are not available at this time. Please try again later.';
+ $timeout(function () {
+ _this.error = null;
+ }, 2000);
});
});
@@ -1634,12 +1649,12 @@
LogicTopologyHelper.setupTree(svg);
this.selectSubscriberModal = function () {
- _this.openSelectSubscriberModal = true;
+ _this2.openSelectSubscriberModal = true;
$scope.$apply();
};
this.subscriberStatusModal = function () {
- _this.openSubscriberStatusModal = true;
+ _this2.openSubscriberStatusModal = true;
$scope.$apply();
};
@@ -1647,9 +1662,9 @@
$rootScope.$on('subscriber.modal.open', function () {
if (ChartData.currentSubscriber) {
- _this.subscriberStatusModal();
+ _this2.subscriberStatusModal();
} else {
- _this.selectSubscriberModal();
+ _this2.selectSubscriberModal();
}
});
@@ -1657,10 +1672,10 @@
$rootScope.$on('subscriber.modal.open', function () {
if (ChartData.currentSubscriber) {
- _this.currentSubscriber = ChartData.currentSubscriber;
- _this.subscriberStatusModal();
+ _this2.currentSubscriber = ChartData.currentSubscriber;
+ _this2.subscriberStatusModal();
} else {
- _this.selectSubscriberModal();
+ _this2.selectSubscriberModal();
}
});
}]
@@ -1862,6 +1877,10 @@
serviceTopologyConfig.elWidths.pop();
}
+ //remove tags and ip
+ delete _this.logicTopologyData.children[0].children[0].children[0].subscriberTag;
+ delete _this.logicTopologyData.children[0].subscriberIP;
+
_this.highlightInstances([]);
delete _this.logicTopologyData.children[0].children[0].children[0].children[0].children;
};
diff --git a/xos/synchronizers/vcpe/files/etc/service/message/run b/xos/synchronizers/vcpe/files/etc/service/message/run
index 2f3b563..7b587d8 100755
--- a/xos/synchronizers/vcpe/files/etc/service/message/run
+++ b/xos/synchronizers/vcpe/files/etc/service/message/run
@@ -5,16 +5,14 @@
class HTTPHandlerOne(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
- # with open('./message.html', 'r') as msgfile:
- with open('../../../../templates/message.html.j2', 'r') as msgfile:
+ with open('./message.html', 'r') as msgfile:
message = msgfile.read()
self.wfile.write(message)
def run(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
- # server_address = ('192.168.0.1', 8000)
- server_address = ('127.0.0.1', 8000)
+ server_address = ('192.168.0.1', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
diff --git a/xos/synchronizers/vcpe/templates/message.html.j2 b/xos/synchronizers/vcpe/templates/message.html.j2
index d56632c..eb4497a 100644
--- a/xos/synchronizers/vcpe/templates/message.html.j2
+++ b/xos/synchronizers/vcpe/templates/message.html.j2
@@ -5,6 +5,10 @@
<title>Service Suspended</title>
<style>
+ .row {
+ width: 100%;
+ }
+
.col-sm-offset-2 {
margin-left: 16.66666667%;
}