GUI -- Created initial device view

Change-Id: Ie9b2a4e743d7a8070c3dfe736ad5a953547bd2f9
diff --git a/web/gui/src/main/webapp/app/fw/nav/nav.html b/web/gui/src/main/webapp/app/fw/nav/nav.html
index b938b1c..1f74ab1 100644
--- a/web/gui/src/main/webapp/app/fw/nav/nav.html
+++ b/web/gui/src/main/webapp/app/fw/nav/nav.html
@@ -5,4 +5,5 @@
 <ul>
     <li> <a ng-click="navCtrl.hideNav()" href="#/sample">Sample View</a></li>
     <li> <a ng-click="navCtrl.hideNav()" href="#/topo">Topology View</a></li>
+    <li> <a ng-click="navCtrl.hideNav()" href="#/device">Device View</a></li>
 </ul>
diff --git a/web/gui/src/main/webapp/app/index.html b/web/gui/src/main/webapp/app/index.html
index 5a61721..d261b3f 100644
--- a/web/gui/src/main/webapp/app/index.html
+++ b/web/gui/src/main/webapp/app/index.html
@@ -57,12 +57,14 @@
     <!-- {INJECTED-JAVASCRIPT} -->
     <script src="view/sample/sample.js"></script>
     <script src="view/topo/topo.js"></script>
+    <script src="view/device/device.js"></script>
     <!-- TODO: inject javascript refs server-side -->
 
     <!-- This is where contributed stylesheets will get injected -->
     <!-- {INJECTED-STYLESHEETS} -->
     <link rel="stylesheet" href="view/sample/sample.css">
     <link rel="stylesheet" href="view/topo/topo.css">
+    <link rel="stylesheet" href="view/device/device.css">
     <!-- TODO: inject style-sheet refs server-side -->
 </head>
 <body class="light" ng-app="onosApp">
diff --git a/web/gui/src/main/webapp/app/onos.js b/web/gui/src/main/webapp/app/onos.js
index 2941f17..8f4a618 100644
--- a/web/gui/src/main/webapp/app/onos.js
+++ b/web/gui/src/main/webapp/app/onos.js
@@ -30,6 +30,7 @@
         // NOTE: 'ov' == 'Onos View'...
         'ovSample',
         'ovTopo',
+        'ovDevice',
         // (end of view modules)
 
         // core modules...
@@ -81,6 +82,11 @@
                     controllerAs: 'ctrl',
                     templateUrl: 'view/topo/topo.html'
                 })
+                .when('/device', {
+                    controller: 'OvDeviceCtrl',
+                    controllerAs: 'ctrl',
+                    templateUrl: 'view/device/device.html'
+                })
                 .otherwise({
                     redirectTo: '/'
                 })
diff --git a/web/gui/src/main/webapp/app/view/device/device.css b/web/gui/src/main/webapp/app/view/device/device.css
new file mode 100644
index 0000000..6b6e2e9
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/device/device.css
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/*
+ ONOS GUI -- Sample View -- CSS file
+
+ @author Simon Hunt
+ */
+
+#ov-device table {
+    border: 1px;
+    /*color: darkorange;*/
+}
\ No newline at end of file
diff --git a/web/gui/src/main/webapp/app/view/device/device.html b/web/gui/src/main/webapp/app/view/device/device.html
new file mode 100644
index 0000000..04fc00a
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/device/device.html
@@ -0,0 +1,15 @@
+<!-- Device partial HTML -->
+<div id="ov-device">
+    <h2>Device View</h2>
+
+    <table>
+        <tr ng-repeat="dev in ctrl.deviceData">
+            <!-- add more property fields for table from device data -->
+            <td>{{dev.id}}</td>
+            <td>{{dev.mfr}}</td>
+            <td>{{dev.hw}}</td>
+            <td>{{dev.sw}}</td>
+        </tr>
+    </table>
+
+</div>
diff --git a/web/gui/src/main/webapp/app/view/device/device.js b/web/gui/src/main/webapp/app/view/device/device.js
new file mode 100644
index 0000000..72c625e
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/device/device.js
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/*
+ ONOS GUI -- Sample View Module
+
+ @author Simon Hunt
+ @author Bri Prebilic Cole
+ */
+
+(function () {
+    'use strict';
+
+    var urlSuffix = '/onos/v1/devices';
+
+    // TODO : refactor into remote service
+    function buildUrl($loc) {
+        return $loc.protocol() + '://' + $loc.host() + ':' + $loc.port();
+    }
+
+    angular.module('ovDevice', [])
+        .controller('OvDeviceCtrl', ['$log', '$http', '$location',
+        function ($log, $http, $loc) {
+            var self = this;
+            self.deviceData = [];
+            var url = buildUrl($loc) + urlSuffix;
+            $log.log(url);
+
+            $http.get(url).then(
+                //success
+                function (response) {
+                    self.deviceData = response.data.devices;
+                },
+                //failure
+                function (response) {
+                    $log.warn('Failed to get device data ', response.status);
+                }
+            );
+
+            $log.log('OvDeviceCtrl has been created');
+        }]);
+}());
diff --git a/web/gui/src/main/webapp/tests/app/view/device/device-spec.js b/web/gui/src/main/webapp/tests/app/view/device/device-spec.js
new file mode 100644
index 0000000..05575cf
--- /dev/null
+++ b/web/gui/src/main/webapp/tests/app/view/device/device-spec.js
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/*
+ ONOS GUI -- Device Controller - Unit Tests
+
+ @author Simon Hunt
+ */
+describe('Controller: OvDeviceCtrl', function () {
+    // instantiate the Device module
+    beforeEach(module('ovDevice'));
+
+    var $log, $controller, ctrl, $mockHttp;
+
+    var fakeData = {
+        "devices": [
+        {
+            "id": "of:0000000000000001",
+            "available": true,
+            "role": "MASTER",
+            "mfr": "Nicira, Inc.",
+            "hw": "Open vSwitch",
+            "sw": "2.0.1",
+            "serial": "None",
+            "annotations": {
+                "protocol": "OF_10"
+            }
+        },
+        {
+            "id": "of:0000000000000004",
+            "available": true,
+            "role": "MASTER",
+            "mfr": "Nicira, Inc.",
+            "hw": "Open vSwitch",
+            "sw": "2.0.1",
+            "serial": "None",
+            "annotations": {
+                "protocol": "OF_10"
+            }
+        }]
+    };
+
+    // we need an instance of the controller
+    beforeEach(inject(function(_$log_, _$controller_, $httpBackend) {
+        $log = _$log_;
+        $controller = _$controller_;
+        $mockHttp = $httpBackend;
+
+        $mockHttp.whenGET(/devices/).respond(fakeData);
+
+    }));
+
+    //afterEach($mockHttp.resetExpectations);
+
+    it('should be an empty array', function () {
+        ctrl = $controller('OvDeviceCtrl');
+        expect(ctrl.deviceData).toEqual([]);
+    });
+
+    it('should have data in it', function () {
+        ctrl = $controller('OvDeviceCtrl');
+        $mockHttp.flush();
+        expect(ctrl.deviceData).toEqual(fakeData.devices);
+    })
+});
diff --git a/web/gui/src/main/webapp/tests/app/view/device/fakeData.json b/web/gui/src/main/webapp/tests/app/view/device/fakeData.json
new file mode 100644
index 0000000..a6bd78f
--- /dev/null
+++ b/web/gui/src/main/webapp/tests/app/view/device/fakeData.json
@@ -0,0 +1,88 @@
+{
+  "devices": [
+    {
+      "id": "of:0000000000000001",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    },
+    {
+      "id": "of:0000000000000004",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    },
+    {
+      "id": "of:0000000000000005",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    },
+    {
+      "id": "of:0000000000000002",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    },
+    {
+      "id": "of:0000000000000003",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    },
+    {
+      "id": "of:0000000000000006",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    },
+    {
+      "id": "of:0000000000000007",
+      "available": true,
+      "role": "MASTER",
+      "mfr": "Nicira, Inc.",
+      "hw": "Open vSwitch",
+      "sw": "2.0.1",
+      "serial": "None",
+      "annotations": {
+        "protocol": "OF_10"
+      }
+    }
+  ]
+}
\ No newline at end of file