1/**
2 * Controller for SNMP
3 *
4 * @module app/configuration
5 * @exports snmpController
6 * @name snmpController
7 */
8
9window.angular && (function(angular) {
10  'use strict';
11
12  angular.module('app.configuration').controller('snmpController', [
13    '$scope', '$window', 'APIUtils', '$route', '$q', 'toastService',
14    function($scope, $window, APIUtils, $route, $q, toastService) {
15      $scope.managers = [];
16      $scope.loading = true;
17      $scope.managersToDelete = [];
18
19      var getSNMPManagers = APIUtils.getSNMPManagers().then(
20          function(data) {
21            // Convert to array of objects from an object of objects, easier
22            // to manipulate (e.g. add/remove). Convert key to a path property.
23            for (var key in data.data) {
24              $scope.managers.push({
25                path: key,
26                port: data.data[key].Port,
27                updatePort: false,
28                address: data.data[key].Address,
29                updateAddress: false
30              })
31            }
32          },
33          function(error) {
34            toastService.error('Unable to load SNMP settings.');
35            console.log(JSON.stringify(error));
36          });
37
38      getSNMPManagers.finally(function() {
39        $scope.loading = false;
40      });
41
42      $scope.addNewSNMPManager = function() {
43        $scope.managers.push({address: '', port: ''});
44      };
45
46      $scope.removeSNMPManager = function(index) {
47        // If the SNMP Manager has a path it exists on the backend and we
48        // need to make a call to remove it
49        if ($scope.managers[index].path) {
50          $scope.managersToDelete.push($scope.managers[index].path);
51        }
52        $scope.managers.splice(index, 1);
53      };
54
55      $scope.refresh = function() {
56        $route.reload();
57      };
58
59      $scope.setSNMP = function() {
60        $scope.loading = true;
61        var promises = [];
62
63        // Validate that no field are empty and port is valid. Port value is
64        // undefined if it is an invalid number.
65        for (var i in $scope.managers) {
66          if (!$scope.managers[i].address || !$scope.managers[i].port) {
67            $scope.loading = false;
68            toastService.error('Cannot save. Please resolve errors on page.');
69            return;
70          }
71        }
72        // Iterate in reverse so can splice
73        // https://stackoverflow.com/questions/9882284/looping-through-array-and-removing-items-without-breaking-for-loop
74        var i = $scope.managers.length;
75        while (i--) {
76          // If the manager does not have a 'path', it is a new manager
77          // and needs to be created
78          if (!$scope.managers[i].path) {
79            promises.push(addManager(
80                $scope.managers[i].address, $scope.managers[i].port));
81          } else {
82            if ($scope.managers[i].updateAddress) {
83              promises.push(setManagerAddress(
84                  $scope.managers[i].path, $scope.managers[i].address));
85            }
86            if ($scope.managers[i].updatePort) {
87              promises.push(setManagerPort(
88                  $scope.managers[i].path, $scope.managers[i].port));
89            }
90          }
91        }
92
93        // Add delete promises last since we might be adding to
94        // managersToDelete above
95        for (var i in $scope.managersToDelete) {
96          promises.push(deleteManager($scope.managersToDelete[i]));
97        }
98
99        $q.all(promises)
100            .then(
101                function() {
102                  toastService.success('SNMP settings have been saved.');
103                },
104                function(errors) {
105                  toastService.error('Unable to set SNMP Managers.');
106                  console.log(JSON.stringify(errors));
107                })
108            .finally(function() {
109              $scope.loading = false;
110            });
111      };
112
113      function addManager(address, port) {
114        return APIUtils.addSNMPManager(address, port);
115      }
116
117      function deleteManager(path) {
118        return APIUtils.deleteObject(path);
119      }
120
121      function setManagerAddress(path, address) {
122        return APIUtils.setSNMPManagerAddress(path, address);
123      }
124
125      function setManagerPort(path, port) {
126        return APIUtils.setSNMPManagerPort(path, port);
127      }
128    }
129  ]);
130})(angular);
131