Update DNS Servers on "Save settings"

"Nameservers" is called "DNS Servers" on the GUI. Update the
property if it has changed when the user hits Save settings
and confirms.

Had difficulties getting the DNS input fields to update the
interface.Nameservers array. The
"ng-blur="interface.Nameservers[$index] = dns" solution is from:
https://stackoverflow.com/questions/13714884/difficulty-with-ng-model-ng-repeat-and-inputs

Tested: Changed some DNS Servers on a Witherspoon.
Change-Id: Ib9c4be044d0725ac50e57e2733c3dc2ef8e29053
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
diff --git a/app/common/services/api-utils.js b/app/common/services/api-utils.js
index d7e4e7f..05b7c0c 100644
--- a/app/common/services/api-utils.js
+++ b/app/common/services/api-utils.js
@@ -247,6 +247,23 @@
                 return response.data;
               });
         },
+        setNameservers: function(interfaceName, dnsServers) {
+          return $http({
+                   method: 'PUT',
+                   url: DataService.getHost() +
+                       '/xyz/openbmc_project/network/' + interfaceName +
+                       '/attr/Nameservers',
+                   headers: {
+                     'Accept': 'application/json',
+                     'Content-Type': 'application/json'
+                   },
+                   withCredentials: true,
+                   data: JSON.stringify({'data': dnsServers})
+                 })
+              .then(function(response) {
+                return response.data;
+              });
+        },
         deleteIPV4: function(interfaceName, networkID) {
           return $http({
                    method: 'POST',
diff --git a/app/configuration/controllers/network-controller.html b/app/configuration/controllers/network-controller.html
index 41ab8a3..dc81ed3 100644
--- a/app/configuration/controllers/network-controller.html
+++ b/app/configuration/controllers/network-controller.html
@@ -75,12 +75,11 @@
 			</div>
 			<fieldset>
 				<div class="column small-12 large-4">
-					<ul>
-						<li ng-repeat="dns in interface.Nameservers track by $index">
-							<label for="net-config__prime-dns">DNS Server {{$index+1}}</label>{{dns}}
-							<br/>
-						</li>
-					</ul>
+						<!-- Call Nameservers "DNS Servers" on the GUI -->
+						<fieldset class="net-config__static-ip-wrap" ng-repeat="dns in interface.Nameservers track by $index">
+							<label for="net-config__prime-dns">DNS Server {{$index+1}}</label>
+							<input id="net-config__prime-dns" type="text" ng-model="dns" ng-blur="interface.Nameservers[$index] = dns"/>
+						</fieldset>
 				</div>
 			</fieldset>
 			<div class="network-config__submit-wrapper">
diff --git a/app/configuration/controllers/network-controller.js b/app/configuration/controllers/network-controller.js
index d5fdc00..4e8a7e0 100644
--- a/app/configuration/controllers/network-controller.js
+++ b/app/configuration/controllers/network-controller.js
@@ -55,6 +55,12 @@
           promises.push(setDHCPEnabled());
         }
 
+        // toString() is a cheap way to compare 2 string arrays
+        if ($scope.interface.Nameservers.toString() !=
+            $scope.old_interface.Nameservers.toString()) {
+          promises.push(setNameservers());
+        }
+
         // Set IPV4 IP Addresses, Netmask Prefix Lengths, and Gateways
         if (!$scope.interface.DHCPEnabled) {
           for (var i in $scope.interface.ipv4.values) {
@@ -164,6 +170,18 @@
                 });
       }
 
+      function setNameservers() {
+        return APIUtils
+            .setNameservers(
+                $scope.selectedInterface, $scope.interface.Nameservers)
+            .then(
+                function(data) {},
+                function(error) {
+                  console.log(JSON.stringify(error));
+                  $scope.set_network_error = 'DNS Servers';
+                });
+      }
+
       function setIPV4(index) {
         // The correct way to edit an IPV4 interface is to remove it and then
         // add a new one