xref: /openbmc/phosphor-webui/app/configuration/controllers/snmp-controller.js (revision ddda4dece0d8c897c0e9189a0aaf0e1b131c4e8a)
1ff64c54aSGunnar Mills/**
2ff64c54aSGunnar Mills * Controller for SNMP
3ff64c54aSGunnar Mills *
4ff64c54aSGunnar Mills * @module app/configuration
5ff64c54aSGunnar Mills * @exports snmpController
6ff64c54aSGunnar Mills * @name snmpController
7ff64c54aSGunnar Mills */
8ff64c54aSGunnar Mills
9ff64c54aSGunnar Millswindow.angular && (function(angular) {
10ff64c54aSGunnar Mills  'use strict';
11ff64c54aSGunnar Mills
12ff64c54aSGunnar Mills  angular.module('app.configuration').controller('snmpController', [
1327ce84d2Sbeccabroek    '$scope', '$window', 'APIUtils', '$route', '$q', 'toastService',
1427ce84d2Sbeccabroek    function($scope, $window, APIUtils, $route, $q, toastService) {
15854fbba1SGunnar Mills      $scope.managers = [];
16ff64c54aSGunnar Mills      $scope.loading = true;
1735d18cbcSGunnar Mills      $scope.managersToDelete = [];
18ff64c54aSGunnar Mills
19ff64c54aSGunnar Mills      var getSNMPManagers = APIUtils.getSNMPManagers().then(
20ff64c54aSGunnar Mills          function(data) {
21854fbba1SGunnar Mills            // Convert to array of objects from an object of objects, easier
22854fbba1SGunnar Mills            // to manipulate (e.g. add/remove). Convert key to a path property.
23854fbba1SGunnar Mills            for (var key in data.data) {
24854fbba1SGunnar Mills              $scope.managers.push({
25854fbba1SGunnar Mills                path: key,
26854fbba1SGunnar Mills                port: data.data[key].Port,
2735d18cbcSGunnar Mills                updatePort: false,
288751084cSGunnar Mills                address: data.data[key].Address,
2935d18cbcSGunnar Mills                updateAddress: false
30854fbba1SGunnar Mills              })
31854fbba1SGunnar Mills            }
32ff64c54aSGunnar Mills          },
33ff64c54aSGunnar Mills          function(error) {
3427ce84d2Sbeccabroek            toastService.error('Unable to load SNMP settings.');
35ff64c54aSGunnar Mills            console.log(JSON.stringify(error));
36ff64c54aSGunnar Mills          });
37ff64c54aSGunnar Mills
38ff64c54aSGunnar Mills      getSNMPManagers.finally(function() {
39ff64c54aSGunnar Mills        $scope.loading = false;
40ff64c54aSGunnar Mills      });
41854fbba1SGunnar Mills
42854fbba1SGunnar Mills      $scope.addNewSNMPManager = function() {
43854fbba1SGunnar Mills        $scope.managers.push({address: '', port: ''});
44854fbba1SGunnar Mills      };
45854fbba1SGunnar Mills
46854fbba1SGunnar Mills      $scope.removeSNMPManager = function(index) {
47854fbba1SGunnar Mills        // If the SNMP Manager has a path it exists on the backend and we
48854fbba1SGunnar Mills        // need to make a call to remove it
49854fbba1SGunnar Mills        if ($scope.managers[index].path) {
5035d18cbcSGunnar Mills          $scope.managersToDelete.push($scope.managers[index].path);
51854fbba1SGunnar Mills        }
52854fbba1SGunnar Mills        $scope.managers.splice(index, 1);
53854fbba1SGunnar Mills      };
54854fbba1SGunnar Mills
55854fbba1SGunnar Mills      $scope.refresh = function() {
56854fbba1SGunnar Mills        $route.reload();
57854fbba1SGunnar Mills      };
58854fbba1SGunnar Mills
59854fbba1SGunnar Mills      $scope.setSNMP = function() {
60854fbba1SGunnar Mills        $scope.loading = true;
61854fbba1SGunnar Mills        var promises = [];
62854fbba1SGunnar Mills
63*ddda4decSbeccabroek        // Validate that no field are empty and port is valid. Port value is
64*ddda4decSbeccabroek        // undefined if it is an invalid number.
65*ddda4decSbeccabroek        for (var i in $scope.managers) {
66*ddda4decSbeccabroek          if (!$scope.managers[i].address || !$scope.managers[i].port) {
67*ddda4decSbeccabroek            $scope.loading = false;
68*ddda4decSbeccabroek            toastService.error('Cannot save. Please resolve errors on page.');
69*ddda4decSbeccabroek            return;
70*ddda4decSbeccabroek          }
71*ddda4decSbeccabroek        }
72*ddda4decSbeccabroek        // Iterate in reverse so can splice
73854fbba1SGunnar Mills        // https://stackoverflow.com/questions/9882284/looping-through-array-and-removing-items-without-breaking-for-loop
74854fbba1SGunnar Mills        var i = $scope.managers.length;
75854fbba1SGunnar Mills        while (i--) {
76854fbba1SGunnar Mills          // If the manager does not have a 'path', it is a new manager
77854fbba1SGunnar Mills          // and needs to be created
78854fbba1SGunnar Mills          if (!$scope.managers[i].path) {
79854fbba1SGunnar Mills            promises.push(addManager(
80854fbba1SGunnar Mills                $scope.managers[i].address, $scope.managers[i].port));
81854fbba1SGunnar Mills          } else {
8235d18cbcSGunnar Mills            if ($scope.managers[i].updateAddress) {
83854fbba1SGunnar Mills              promises.push(setManagerAddress(
84854fbba1SGunnar Mills                  $scope.managers[i].path, $scope.managers[i].address));
858751084cSGunnar Mills            }
8635d18cbcSGunnar Mills            if ($scope.managers[i].updatePort) {
87854fbba1SGunnar Mills              promises.push(setManagerPort(
88854fbba1SGunnar Mills                  $scope.managers[i].path, $scope.managers[i].port));
89854fbba1SGunnar Mills            }
90854fbba1SGunnar Mills          }
918751084cSGunnar Mills        }
92854fbba1SGunnar Mills
93854fbba1SGunnar Mills        // Add delete promises last since we might be adding to
9435d18cbcSGunnar Mills        // managersToDelete above
9535d18cbcSGunnar Mills        for (var i in $scope.managersToDelete) {
9635d18cbcSGunnar Mills          promises.push(deleteManager($scope.managersToDelete[i]));
97854fbba1SGunnar Mills        }
98854fbba1SGunnar Mills
99854fbba1SGunnar Mills        $q.all(promises)
100854fbba1SGunnar Mills            .then(
101854fbba1SGunnar Mills                function() {
102*ddda4decSbeccabroek                  toastService.success('SNMP settings have been saved.');
103854fbba1SGunnar Mills                },
104854fbba1SGunnar Mills                function(errors) {
10527ce84d2Sbeccabroek                  toastService.error('Unable to set SNMP Managers.');
106854fbba1SGunnar Mills                  console.log(JSON.stringify(errors));
107854fbba1SGunnar Mills                })
108854fbba1SGunnar Mills            .finally(function() {
109854fbba1SGunnar Mills              $scope.loading = false;
110854fbba1SGunnar Mills            });
111854fbba1SGunnar Mills      };
112854fbba1SGunnar Mills
113854fbba1SGunnar Mills      function addManager(address, port) {
114854fbba1SGunnar Mills        return APIUtils.addSNMPManager(address, port);
115854fbba1SGunnar Mills      }
116854fbba1SGunnar Mills
117854fbba1SGunnar Mills      function deleteManager(path) {
118854fbba1SGunnar Mills        return APIUtils.deleteObject(path);
119854fbba1SGunnar Mills      }
120854fbba1SGunnar Mills
121854fbba1SGunnar Mills      function setManagerAddress(path, address) {
122854fbba1SGunnar Mills        return APIUtils.setSNMPManagerAddress(path, address);
123854fbba1SGunnar Mills      }
124854fbba1SGunnar Mills
125854fbba1SGunnar Mills      function setManagerPort(path, port) {
126854fbba1SGunnar Mills        return APIUtils.setSNMPManagerPort(path, port);
127854fbba1SGunnar Mills      }
128ff64c54aSGunnar Mills    }
129ff64c54aSGunnar Mills  ]);
130ff64c54aSGunnar Mills})(angular);
131