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 (let 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        let managersLength = $scope.managers.length;
75        while (managersLength--) {
76          // If the manager does not have a 'path', it is a new manager
77          // and needs to be created
78          if (!$scope.managers[managersLength].path) {
79            promises.push(addManager(
80                $scope.managers[managersLength].address,
81                $scope.managers[managersLength].port));
82          } else {
83            if ($scope.managers[managersLength].updateAddress) {
84              promises.push(setManagerAddress(
85                  $scope.managers[managersLength].path,
86                  $scope.managers[managersLength].address));
87            }
88            if ($scope.managers[managersLength].updatePort) {
89              promises.push(setManagerPort(
90                  $scope.managers[managersLength].path,
91                  $scope.managers[managersLength].port));
92            }
93          }
94        }
95
96        // Add delete promises last since we might be adding to
97        // managersToDelete above
98        for (let i in $scope.managersToDelete) {
99          promises.push(deleteManager($scope.managersToDelete[i]));
100        }
101
102        $q.all(promises)
103            .then(
104                function() {
105                  $scope.refresh();
106                  toastService.success('SNMP settings have been saved.');
107                },
108                function(errors) {
109                  toastService.error('Unable to set SNMP Managers.');
110                  console.log(JSON.stringify(errors));
111                })
112            .finally(function() {
113              $scope.loading = false;
114            });
115      };
116
117      function addManager(address, port) {
118        return APIUtils.addSNMPManager(address, port);
119      }
120
121      function deleteManager(path) {
122        return APIUtils.deleteObject(path);
123      }
124
125      function setManagerAddress(path, address) {
126        return APIUtils.setSNMPManagerAddress(path, address);
127      }
128
129      function setManagerPort(path, port) {
130        return APIUtils.setSNMPManagerPort(path, port);
131      }
132    }
133  ]);
134})(angular);
135