1 /**
2  * Copyright © 2021 IBM Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include "missing_owner_target.hpp"
17 
18 #include "../manager.hpp"
19 #include "../zone.hpp"
20 #include "group.hpp"
21 
22 #include <fmt/format.h>
23 
24 #include <nlohmann/json.hpp>
25 #include <phosphor-logging/log.hpp>
26 
27 #include <algorithm>
28 
29 namespace phosphor::fan::control::json
30 {
31 
32 using json = nlohmann::json;
33 using namespace phosphor::logging;
34 
35 MissingOwnerTarget::MissingOwnerTarget(const json& jsonObj,
36                                        const std::vector<Group>& groups) :
37     ActionBase(jsonObj, groups)
38 {
39     setTarget(jsonObj);
40 }
41 
42 void MissingOwnerTarget::run(Zone& zone)
43 {
44     for (const auto& group : _groups)
45     {
46         const auto& members = group.getMembers();
47         auto isMissingOwner =
48             std::any_of(members.begin(), members.end(),
49                         [&intf = group.getInterface()](const auto& member) {
50                             return !Manager::hasOwner(member, intf);
51                         });
52         if (isMissingOwner)
53         {
54             zone.setTarget(_target);
55         }
56         // Update group's fan control active allowed based on action results
57         zone.setActiveAllow(group.getName(), !isMissingOwner);
58     }
59 }
60 
61 void MissingOwnerTarget::setTarget(const json& jsonObj)
62 {
63     if (!jsonObj.contains("speed"))
64     {
65         throw ActionParseError{ActionBase::getName(),
66                                "Missing required speed value"};
67     }
68     _target = jsonObj["speed"].get<uint64_t>();
69 }
70 
71 } // namespace phosphor::fan::control::json
72