GUI -- Added mechanism to test device view.
Themed device view. Change-Id: I471ec56b94c927d834f8067d06efce33ddfa4596
Showing
11 changed files
with
183 additions
and
58 deletions
web/gui/src/main/webapp/app/common.css
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/* | ||
| 18 | + ONOS GUI -- common -- CSS file | ||
| 19 | + | ||
| 20 | + @author Simon Hunt | ||
| 21 | + @author Bri Prebilic Cole | ||
| 22 | + */ | ||
| 23 | + | ||
| 24 | +table.summary-list { | ||
| 25 | + /*border: 1px solid red;*/ | ||
| 26 | + margin: 4px 50px; | ||
| 27 | + font-size: 10pt; | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +table.summary-list th { | ||
| 31 | + padding: 5px; | ||
| 32 | +} | ||
| 33 | +.light table.summary-list th { | ||
| 34 | + background-color: #bbb; | ||
| 35 | +} | ||
| 36 | +.dark table.summary-list th { | ||
| 37 | + background-color: #444; | ||
| 38 | + color: #ddd; | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +table.summary-list td { | ||
| 42 | + padding: 5px; | ||
| 43 | +} | ||
| 44 | +.light table.summary-list td { | ||
| 45 | + background-color: #ddd; | ||
| 46 | +} | ||
| 47 | +.dark table.summary-list td { | ||
| 48 | + background-color: #666; | ||
| 49 | + color: #ddd; | ||
| 50 | +} |
| ... | @@ -25,17 +25,94 @@ | ... | @@ -25,17 +25,94 @@ |
| 25 | 25 | ||
| 26 | var $log; | 26 | var $log; |
| 27 | 27 | ||
| 28 | + var urlSuffix = '/ui/rs/'; | ||
| 29 | + | ||
| 30 | + | ||
| 31 | + | ||
| 32 | + // TODO: remove temporary test code | ||
| 33 | + var fakeData = { | ||
| 34 | + '1': { | ||
| 35 | + "devices": [{ | ||
| 36 | + "id": "of:0000000000000001", | ||
| 37 | + "available": true, | ||
| 38 | + "role": "MASTER", | ||
| 39 | + "mfr": "Nicira, Inc.", | ||
| 40 | + "hw": "Open vSwitch", | ||
| 41 | + "sw": "2.0.1", | ||
| 42 | + "serial": "None", | ||
| 43 | + "annotations": { | ||
| 44 | + "protocol": "OF_10" | ||
| 45 | + } | ||
| 46 | + }, | ||
| 47 | + { | ||
| 48 | + "id": "of:0000000000000004", | ||
| 49 | + "available": true, | ||
| 50 | + "role": "MASTER", | ||
| 51 | + "mfr": "Nicira, Inc.", | ||
| 52 | + "hw": "Open vSwitch", | ||
| 53 | + "sw": "2.0.1", | ||
| 54 | + "serial": "None", | ||
| 55 | + "annotations": { | ||
| 56 | + "protocol": "OF_10" | ||
| 57 | + } | ||
| 58 | + }] | ||
| 59 | + }, | ||
| 60 | + '2': { | ||
| 61 | + "devices": [{ | ||
| 62 | + "id": "of:0000000000000002", | ||
| 63 | + "available": true, | ||
| 64 | + "role": "MASTER", | ||
| 65 | + "mfr": "Nicira, Inc.", | ||
| 66 | + "hw": "Open vSwitch", | ||
| 67 | + "sw": "2.0.0", | ||
| 68 | + "serial": "None", | ||
| 69 | + "annotations": { | ||
| 70 | + "protocol": "OF_10" | ||
| 71 | + } | ||
| 72 | + }, | ||
| 73 | + { | ||
| 74 | + "id": "of:0000000000000006", | ||
| 75 | + "available": true, | ||
| 76 | + "role": "MASTER", | ||
| 77 | + "mfr": "Nicira, Inc.", | ||
| 78 | + "hw": "Open vSwitch", | ||
| 79 | + "sw": "2.1.1", | ||
| 80 | + "serial": "None", | ||
| 81 | + "annotations": { | ||
| 82 | + "protocol": "OF_10" | ||
| 83 | + } | ||
| 84 | + }] | ||
| 85 | + }, | ||
| 86 | + 'empty': { | ||
| 87 | + devices: [] | ||
| 88 | + } | ||
| 89 | + }; | ||
| 90 | + | ||
| 91 | + function getFakeData(url) { | ||
| 92 | + var id = url.slice(5); | ||
| 93 | + | ||
| 94 | + return fakeData[id] || fakeData.empty; | ||
| 95 | + } | ||
| 96 | + | ||
| 28 | angular.module('onosRemote') | 97 | angular.module('onosRemote') |
| 29 | - .factory('RestService', ['$log', '$http', function (_$log_, $http) { | 98 | + .factory('RestService', ['$log', '$http', 'UrlFnService', |
| 99 | + function (_$log_, $http, ufs) { | ||
| 30 | $log = _$log_; | 100 | $log = _$log_; |
| 31 | 101 | ||
| 32 | function get(url, callback) { | 102 | function get(url, callback) { |
| 33 | - $http.get(url).then(function (response) { | 103 | + // TODO: remove temporary test code |
| 104 | + if (url.match(/^test\//)) { | ||
| 105 | + callback(getFakeData(url)); | ||
| 106 | + return; | ||
| 107 | + } | ||
| 108 | + var fullUrl = ufs.urlPrefix() + urlSuffix + url; | ||
| 109 | + | ||
| 110 | + $http.get(fullUrl).then(function (response) { | ||
| 34 | // success | 111 | // success |
| 35 | callback(response.data); | 112 | callback(response.data); |
| 36 | }, function (response) { | 113 | }, function (response) { |
| 37 | // error | 114 | // error |
| 38 | - $log.warn('Failed to retrieve JSON data: ' + url, | 115 | + $log.warn('Failed to retrieve JSON data: ' + fullUrl, |
| 39 | response.status, response.data); | 116 | response.status, response.data); |
| 40 | }); | 117 | }); |
| 41 | } | 118 | } | ... | ... |
| ... | @@ -49,9 +49,14 @@ | ... | @@ -49,9 +49,14 @@ |
| 49 | <script src="fw/svg/map.js"></script> | 49 | <script src="fw/svg/map.js"></script> |
| 50 | <script src="fw/svg/zoom.js"></script> | 50 | <script src="fw/svg/zoom.js"></script> |
| 51 | 51 | ||
| 52 | + <script src="fw/remote/remote.js"></script> | ||
| 53 | + <script src="fw/remote/urlfn.js"></script> | ||
| 54 | + <script src="fw/remote/rest.js"></script> | ||
| 55 | + | ||
| 52 | <!-- Framework and library stylesheets included here --> | 56 | <!-- Framework and library stylesheets included here --> |
| 53 | <!-- TODO: use a single catenated-minified file here --> | 57 | <!-- TODO: use a single catenated-minified file here --> |
| 54 | <link rel="stylesheet" href="onos.css"> | 58 | <link rel="stylesheet" href="onos.css"> |
| 59 | + <link rel="stylesheet" href="common.css"> | ||
| 55 | <link rel="stylesheet" href="fw/mast/mast.css"> | 60 | <link rel="stylesheet" href="fw/mast/mast.css"> |
| 56 | <link rel="stylesheet" href="fw/nav/nav.css"> | 61 | <link rel="stylesheet" href="fw/nav/nav.css"> |
| 57 | 62 | ... | ... |
| ... | @@ -2,7 +2,13 @@ | ... | @@ -2,7 +2,13 @@ |
| 2 | <div id="ov-device"> | 2 | <div id="ov-device"> |
| 3 | <h2>Device View</h2> | 3 | <h2>Device View</h2> |
| 4 | 4 | ||
| 5 | - <table> | 5 | + <table class="summary-list"> |
| 6 | + <tr> | ||
| 7 | + <th>ID</th> | ||
| 8 | + <th>Manufacturer</th> | ||
| 9 | + <th>Hardware Version</th> | ||
| 10 | + <th>Software Version</th> | ||
| 11 | + </tr> | ||
| 6 | <tr ng-repeat="dev in ctrl.deviceData"> | 12 | <tr ng-repeat="dev in ctrl.deviceData"> |
| 7 | <!-- add more property fields for table from device data --> | 13 | <!-- add more property fields for table from device data --> |
| 8 | <td>{{dev.id}}</td> | 14 | <td>{{dev.id}}</td> | ... | ... |
| ... | @@ -24,26 +24,19 @@ | ... | @@ -24,26 +24,19 @@ |
| 24 | (function () { | 24 | (function () { |
| 25 | 'use strict'; | 25 | 'use strict'; |
| 26 | 26 | ||
| 27 | - var urlSuffix = '/onos/v1/devices'; | ||
| 28 | - | ||
| 29 | angular.module('ovDevice', []) | 27 | angular.module('ovDevice', []) |
| 30 | - .controller('OvDeviceCtrl', ['$log', '$location', | 28 | + .controller('OvDeviceCtrl', ['$log', '$location', 'RestService', |
| 31 | - function ($log, $http, $loc) { | 29 | + function ($log, $location, rs) { |
| 32 | var self = this; | 30 | var self = this; |
| 33 | self.deviceData = []; | 31 | self.deviceData = []; |
| 34 | - //var url = buildUrl($loc) + urlSuffix; | ||
| 35 | - //$log.log(url); | ||
| 36 | 32 | ||
| 37 | - //$http.get(url).then( | 33 | + // TODO: remove test code |
| 38 | - // //success | 34 | + var testCase = $location.search().test; |
| 39 | - // function (response) { | 35 | + var url = testCase ? 'test/' + testCase : 'device'; |
| 40 | - // self.deviceData = response.data.devices; | 36 | + |
| 41 | - // }, | 37 | + rs.get(url, function (data) { |
| 42 | - // //failure | 38 | + self.deviceData = data.devices; |
| 43 | - // function (response) { | 39 | + }); |
| 44 | - // $log.warn('Failed to get device data ', response.status); | ||
| 45 | - // } | ||
| 46 | - //); | ||
| 47 | 40 | ||
| 48 | $log.log('OvDeviceCtrl has been created'); | 41 | $log.log('OvDeviceCtrl has been created'); |
| 49 | }]); | 42 | }]); | ... | ... |
| ... | @@ -25,6 +25,16 @@ describe('factory: fw/remote/rest.js', function() { | ... | @@ -25,6 +25,16 @@ describe('factory: fw/remote/rest.js', function() { |
| 25 | 25 | ||
| 26 | beforeEach(module('onosUtil', 'onosRemote')); | 26 | beforeEach(module('onosUtil', 'onosRemote')); |
| 27 | 27 | ||
| 28 | + beforeEach(module(function($provide) { | ||
| 29 | + $provide.factory('$location', function (){ | ||
| 30 | + return { | ||
| 31 | + protocol: function () { return 'http'; }, | ||
| 32 | + host: function () { return 'foo'; }, | ||
| 33 | + port: function () { return '80'; } | ||
| 34 | + }; | ||
| 35 | + }) | ||
| 36 | + })); | ||
| 37 | + | ||
| 28 | beforeEach(inject(function (_$log_, _$httpBackend_, FnService, RestService) { | 38 | beforeEach(inject(function (_$log_, _$httpBackend_, FnService, RestService) { |
| 29 | $log = _$log_; | 39 | $log = _$log_; |
| 30 | $httpBackend = _$httpBackend_; | 40 | $httpBackend = _$httpBackend_; |
| ... | @@ -50,10 +60,10 @@ describe('factory: fw/remote/rest.js', function() { | ... | @@ -50,10 +60,10 @@ describe('factory: fw/remote/rest.js', function() { |
| 50 | it('should fetch remote data', function () { | 60 | it('should fetch remote data', function () { |
| 51 | var called = 0, | 61 | var called = 0, |
| 52 | capture = null; | 62 | capture = null; |
| 53 | - $httpBackend.expectGET('/bar').respond(mockData); | 63 | + $httpBackend.whenGET(/.*/).respond(mockData); |
| 54 | spyOn($log, 'warn'); | 64 | spyOn($log, 'warn'); |
| 55 | 65 | ||
| 56 | - rs.get('/bar', function (data) { | 66 | + rs.get('bar', function (data) { |
| 57 | called++; | 67 | called++; |
| 58 | capture = data; | 68 | capture = data; |
| 59 | }); | 69 | }); |
| ... | @@ -69,10 +79,10 @@ describe('factory: fw/remote/rest.js', function() { | ... | @@ -69,10 +79,10 @@ describe('factory: fw/remote/rest.js', function() { |
| 69 | it('should fail to fetch remote data', function () { | 79 | it('should fail to fetch remote data', function () { |
| 70 | var called = 0, | 80 | var called = 0, |
| 71 | capture = null; | 81 | capture = null; |
| 72 | - $httpBackend.expectGET('/bar').respond(404, 'Not Found'); | 82 | + $httpBackend.whenGET(/.*/).respond(404, 'Not Found'); |
| 73 | spyOn($log, 'warn'); | 83 | spyOn($log, 'warn'); |
| 74 | 84 | ||
| 75 | - rs.get('/bar', function (data) { | 85 | + rs.get('bar', function (data) { |
| 76 | called++; | 86 | called++; |
| 77 | capture = data; | 87 | capture = data; |
| 78 | }); | 88 | }); |
| ... | @@ -82,9 +92,8 @@ describe('factory: fw/remote/rest.js', function() { | ... | @@ -82,9 +92,8 @@ describe('factory: fw/remote/rest.js', function() { |
| 82 | $httpBackend.flush(); | 92 | $httpBackend.flush(); |
| 83 | expect(called).toEqual(0); | 93 | expect(called).toEqual(0); |
| 84 | expect(capture).toBeNull(); | 94 | expect(capture).toBeNull(); |
| 85 | - expect($log.warn) | 95 | + expect($log.warn).toHaveBeenCalledWith( |
| 86 | - .toHaveBeenCalledWith('Failed to retrieve JSON data: /bar', | 96 | + 'Failed to retrieve JSON data: http://foo:80/ui/rs/bar', 404, 'Not Found'); |
| 87 | - 404, 'Not Found'); | ||
| 88 | }); | 97 | }); |
| 89 | 98 | ||
| 90 | }); | 99 | }); | ... | ... |
| ... | @@ -28,7 +28,7 @@ describe('factory: fw/remote/urlfn.js', function () { | ... | @@ -28,7 +28,7 @@ describe('factory: fw/remote/urlfn.js', function () { |
| 28 | beforeEach(module(function($provide) { | 28 | beforeEach(module(function($provide) { |
| 29 | $provide.factory('$location', function (){ | 29 | $provide.factory('$location', function (){ |
| 30 | return { | 30 | return { |
| 31 | - protocol: function () { return '$http'; }, | 31 | + protocol: function () { return 'http'; }, |
| 32 | host: function () { return 'foo'; }, | 32 | host: function () { return 'foo'; }, |
| 33 | port: function () { return '80'; } | 33 | port: function () { return '80'; } |
| 34 | }; | 34 | }; |
| ... | @@ -53,6 +53,6 @@ describe('factory: fw/remote/urlfn.js', function () { | ... | @@ -53,6 +53,6 @@ describe('factory: fw/remote/urlfn.js', function () { |
| 53 | }); | 53 | }); |
| 54 | 54 | ||
| 55 | it('should build the url prefix', function () { | 55 | it('should build the url prefix', function () { |
| 56 | - expect(ufs.urlPrefix()).toEqual('$http://foo:80'); | 56 | + expect(ufs.urlPrefix()).toEqual('http://foo:80'); |
| 57 | }); | 57 | }); |
| 58 | }); | 58 | }); | ... | ... |
| ... | @@ -21,58 +21,40 @@ | ... | @@ -21,58 +21,40 @@ |
| 21 | */ | 21 | */ |
| 22 | describe('Controller: OvDeviceCtrl', function () { | 22 | describe('Controller: OvDeviceCtrl', function () { |
| 23 | // instantiate the Device module | 23 | // instantiate the Device module |
| 24 | - beforeEach(module('ovDevice')); | 24 | + beforeEach(module('ovDevice', 'onosRemote')); |
| 25 | 25 | ||
| 26 | var $log, $controller, ctrl, $mockHttp; | 26 | var $log, $controller, ctrl, $mockHttp; |
| 27 | 27 | ||
| 28 | var fakeData = { | 28 | var fakeData = { |
| 29 | - "devices": [ | 29 | + "devices": [{ |
| 30 | - { | ||
| 31 | "id": "of:0000000000000001", | 30 | "id": "of:0000000000000001", |
| 32 | "available": true, | 31 | "available": true, |
| 33 | - "role": "MASTER", | ||
| 34 | "mfr": "Nicira, Inc.", | 32 | "mfr": "Nicira, Inc.", |
| 35 | "hw": "Open vSwitch", | 33 | "hw": "Open vSwitch", |
| 36 | - "sw": "2.0.1", | 34 | + "sw": "2.0.1" |
| 37 | - "serial": "None", | ||
| 38 | - "annotations": { | ||
| 39 | - "protocol": "OF_10" | ||
| 40 | - } | ||
| 41 | }, | 35 | }, |
| 42 | { | 36 | { |
| 43 | "id": "of:0000000000000004", | 37 | "id": "of:0000000000000004", |
| 44 | "available": true, | 38 | "available": true, |
| 45 | - "role": "MASTER", | ||
| 46 | "mfr": "Nicira, Inc.", | 39 | "mfr": "Nicira, Inc.", |
| 47 | "hw": "Open vSwitch", | 40 | "hw": "Open vSwitch", |
| 48 | - "sw": "2.0.1", | 41 | + "sw": "2.0.1" |
| 49 | - "serial": "None", | ||
| 50 | - "annotations": { | ||
| 51 | - "protocol": "OF_10" | ||
| 52 | - } | ||
| 53 | }] | 42 | }] |
| 54 | }; | 43 | }; |
| 55 | 44 | ||
| 56 | - // we need an instance of the controller | ||
| 57 | beforeEach(inject(function(_$log_, _$controller_, $httpBackend) { | 45 | beforeEach(inject(function(_$log_, _$controller_, $httpBackend) { |
| 58 | $log = _$log_; | 46 | $log = _$log_; |
| 59 | $controller = _$controller_; | 47 | $controller = _$controller_; |
| 60 | $mockHttp = $httpBackend; | 48 | $mockHttp = $httpBackend; |
| 61 | 49 | ||
| 62 | - $mockHttp.whenGET(/devices/).respond(fakeData); | 50 | + $mockHttp.whenGET(/\/device$/).respond(fakeData); |
| 63 | - | ||
| 64 | })); | 51 | })); |
| 65 | 52 | ||
| 66 | - //afterEach($mockHttp.resetExpectations); | ||
| 67 | - | ||
| 68 | it('should be an empty array', function () { | 53 | it('should be an empty array', function () { |
| 69 | ctrl = $controller('OvDeviceCtrl'); | 54 | ctrl = $controller('OvDeviceCtrl'); |
| 70 | expect(ctrl.deviceData).toEqual([]); | 55 | expect(ctrl.deviceData).toEqual([]); |
| 56 | + $mockHttp.flush(); | ||
| 57 | + expect(ctrl.deviceData).toEqual(fakeData.devices); | ||
| 71 | }); | 58 | }); |
| 72 | 59 | ||
| 73 | - //it('should have data in it', function () { | ||
| 74 | - // ctrl = $controller('OvDeviceCtrl'); | ||
| 75 | - // //$mockHttp.flush(); | ||
| 76 | - // expect(ctrl.deviceData).toEqual(fakeData.devices); | ||
| 77 | - //}) | ||
| 78 | }); | 60 | }); | ... | ... |
-
Please register or login to post a comment