xref: /openbmc/phosphor-webui/app/configuration/controllers/snmp-controller.js (revision 8751084c3a7430509a3a3c9e5c415e963f7922e4)
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', [
13854fbba1SGunnar Mills    '$scope', '$window', 'APIUtils', '$route', '$q',
14854fbba1SGunnar Mills    function($scope, $window, APIUtils, $route, $q) {
15854fbba1SGunnar Mills      $scope.managers = [];
16ff64c54aSGunnar Mills      $scope.loading = true;
17854fbba1SGunnar Mills      $scope.error = false;
18854fbba1SGunnar Mills      $scope.success = false;
19854fbba1SGunnar Mills      $scope.managers_to_delete = [];
20ff64c54aSGunnar Mills
21ff64c54aSGunnar Mills      var getSNMPManagers = APIUtils.getSNMPManagers().then(
22ff64c54aSGunnar Mills          function(data) {
23854fbba1SGunnar Mills            // Convert to array of objects from an object of objects, easier
24854fbba1SGunnar Mills            // to manipulate (e.g. add/remove). Convert key to a path property.
25854fbba1SGunnar Mills            for (var key in data.data) {
26854fbba1SGunnar Mills              $scope.managers.push({
27854fbba1SGunnar Mills                path: key,
28854fbba1SGunnar Mills                port: data.data[key].Port,
29*8751084cSGunnar Mills                update_port: false,
30*8751084cSGunnar Mills                address: data.data[key].Address,
31*8751084cSGunnar Mills                update_address: false
32854fbba1SGunnar Mills              })
33854fbba1SGunnar Mills            }
34ff64c54aSGunnar Mills          },
35ff64c54aSGunnar Mills          function(error) {
36ff64c54aSGunnar Mills            console.log(JSON.stringify(error));
37ff64c54aSGunnar Mills          });
38ff64c54aSGunnar Mills
39ff64c54aSGunnar Mills      getSNMPManagers.finally(function() {
40ff64c54aSGunnar Mills        $scope.loading = false;
41ff64c54aSGunnar Mills      });
42854fbba1SGunnar Mills
43854fbba1SGunnar Mills      $scope.addNewSNMPManager = function() {
44854fbba1SGunnar Mills        $scope.managers.push({address: '', port: ''});
45854fbba1SGunnar Mills      };
46854fbba1SGunnar Mills
47854fbba1SGunnar Mills      $scope.removeSNMPManager = function(index) {
48854fbba1SGunnar Mills        // If the SNMP Manager has a path it exists on the backend and we
49854fbba1SGunnar Mills        // need to make a call to remove it
50854fbba1SGunnar Mills        if ($scope.managers[index].path) {
51854fbba1SGunnar Mills          $scope.managers_to_delete.push($scope.managers[index].path);
52854fbba1SGunnar Mills        }
53854fbba1SGunnar Mills        $scope.managers.splice(index, 1);
54854fbba1SGunnar Mills      };
55854fbba1SGunnar Mills
56854fbba1SGunnar Mills      $scope.refresh = function() {
57854fbba1SGunnar Mills        $route.reload();
58854fbba1SGunnar Mills      };
59854fbba1SGunnar Mills
60854fbba1SGunnar Mills      $scope.setSNMP = function() {
61854fbba1SGunnar Mills        $scope.error = false;
62854fbba1SGunnar Mills        $scope.success = false;
63854fbba1SGunnar Mills        $scope.loading = true;
64854fbba1SGunnar Mills        var promises = [];
65854fbba1SGunnar Mills
66854fbba1SGunnar Mills        // Interate in reverse so can splice
67854fbba1SGunnar Mills        // https://stackoverflow.com/questions/9882284/looping-through-array-and-removing-items-without-breaking-for-loop
68854fbba1SGunnar Mills        var i = $scope.managers.length;
69854fbba1SGunnar Mills        while (i--) {
70854fbba1SGunnar Mills          // Remove any SNMP Manager with an empty address and port
71854fbba1SGunnar Mills          if (!$scope.managers[i].address && !$scope.managers[i].port) {
72854fbba1SGunnar Mills            $scope.removeSNMPManager(i);
73854fbba1SGunnar Mills            continue;
74854fbba1SGunnar Mills          }
75854fbba1SGunnar Mills
76854fbba1SGunnar Mills          // Throw an error if only 1 of the fields is filled out
77854fbba1SGunnar Mills          if (!$scope.managers[i].address || !$scope.managers[i].port) {
78854fbba1SGunnar Mills            // TODO: Highlight the field that is empty
79854fbba1SGunnar Mills            $scope.loading = false;
80854fbba1SGunnar Mills            $scope.error = true;
81854fbba1SGunnar Mills            return;
82854fbba1SGunnar Mills          }
83854fbba1SGunnar Mills
84854fbba1SGunnar Mills          // If the manager does not have a 'path', it is a new manager
85854fbba1SGunnar Mills          // and needs to be created
86854fbba1SGunnar Mills          if (!$scope.managers[i].path) {
87854fbba1SGunnar Mills            promises.push(addManager(
88854fbba1SGunnar Mills                $scope.managers[i].address, $scope.managers[i].port));
89854fbba1SGunnar Mills          } else {
90*8751084cSGunnar Mills            if ($scope.managers[i].update_address) {
91854fbba1SGunnar Mills              promises.push(setManagerAddress(
92854fbba1SGunnar Mills                  $scope.managers[i].path, $scope.managers[i].address));
93*8751084cSGunnar Mills            }
94*8751084cSGunnar Mills            if ($scope.managers[i].update_port) {
95854fbba1SGunnar Mills              promises.push(setManagerPort(
96854fbba1SGunnar Mills                  $scope.managers[i].path, $scope.managers[i].port));
97854fbba1SGunnar Mills            }
98854fbba1SGunnar Mills          }
99*8751084cSGunnar Mills        }
100854fbba1SGunnar Mills
101854fbba1SGunnar Mills        // Add delete promises last since we might be adding to
102854fbba1SGunnar Mills        // managers_to_delete above
103854fbba1SGunnar Mills        for (var i in $scope.managers_to_delete) {
104854fbba1SGunnar Mills          promises.push(deleteManager($scope.managers_to_delete[i]));
105854fbba1SGunnar Mills        }
106854fbba1SGunnar Mills
107854fbba1SGunnar Mills        $q.all(promises)
108854fbba1SGunnar Mills            .then(
109854fbba1SGunnar Mills                function() {
110854fbba1SGunnar Mills                  $scope.success = true;
111854fbba1SGunnar Mills                },
112854fbba1SGunnar Mills                function(errors) {
113854fbba1SGunnar Mills                  console.log(JSON.stringify(errors));
114854fbba1SGunnar Mills                  $scope.error = true;
115854fbba1SGunnar Mills                })
116854fbba1SGunnar Mills            .finally(function() {
117854fbba1SGunnar Mills              $scope.loading = false;
118854fbba1SGunnar Mills            });
119854fbba1SGunnar Mills      };
120854fbba1SGunnar Mills
121854fbba1SGunnar Mills      function addManager(address, port) {
122854fbba1SGunnar Mills        return APIUtils.addSNMPManager(address, port);
123854fbba1SGunnar Mills      }
124854fbba1SGunnar Mills
125854fbba1SGunnar Mills      function deleteManager(path) {
126854fbba1SGunnar Mills        return APIUtils.deleteObject(path);
127854fbba1SGunnar Mills      }
128854fbba1SGunnar Mills
129854fbba1SGunnar Mills      function setManagerAddress(path, address) {
130854fbba1SGunnar Mills        return APIUtils.setSNMPManagerAddress(path, address);
131854fbba1SGunnar Mills      }
132854fbba1SGunnar Mills
133854fbba1SGunnar Mills      function setManagerPort(path, port) {
134854fbba1SGunnar Mills        return APIUtils.setSNMPManagerPort(path, port);
135854fbba1SGunnar Mills      }
136ff64c54aSGunnar Mills    }
137ff64c54aSGunnar Mills  ]);
138ff64c54aSGunnar Mills})(angular);
139