blob: d4ca8852856dd97490e1e76ea202201016f33cb3 [file] [log] [blame]
Saqib Khanb0774702017-05-23 16:02:41 -05001#include "activation.hpp"
Saqib Khan4c1aec02017-07-06 11:46:13 -05002#include "item_updater.hpp"
Michael Tritzf2b5e0d2017-07-25 14:39:34 -05003#include "config.h"
Saqib Khan5d532672017-08-09 10:44:50 -05004#include "serialize.hpp"
Saqib Khanb9da6632017-09-13 09:48:37 -05005#include <phosphor-logging/log.hpp>
6
Saqib Khanb0774702017-05-23 16:02:41 -05007namespace phosphor
8{
9namespace software
10{
11namespace updater
12{
13
14namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server;
15
Saqib Khanb9da6632017-09-13 09:48:37 -050016using namespace phosphor::logging;
17
Michael Tritzbed88af2017-07-19 16:00:06 -050018void Activation::subscribeToSystemdSignals()
19{
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050020 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050021 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050022 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050023 "Subscribe");
24 this->bus.call_noreply(method);
25
26 return;
27}
28
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050029void Activation::unsubscribeFromSystemdSignals()
30{
31 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME,
32 SYSTEMD_PATH,
33 SYSTEMD_INTERFACE,
34 "Unsubscribe");
35 this->bus.call_noreply(method);
36
37 return;
38}
39
Saqib Khanb0774702017-05-23 16:02:41 -050040auto Activation::activation(Activations value) ->
41 Activations
42{
Saqib Khan4c1aec02017-07-06 11:46:13 -050043
44 if (value != softwareServer::Activation::Activations::Active)
45 {
46 redundancyPriority.reset(nullptr);
47 }
48
Saqib Khanb0774702017-05-23 16:02:41 -050049 if (value == softwareServer::Activation::Activations::Activating)
50 {
Michael Tritzbed88af2017-07-19 16:00:06 -050051 if (rwVolumeCreated == false && roVolumeCreated == false)
Saqib Khanb0774702017-05-23 16:02:41 -050052 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050053 if (!activationProgress)
54 {
55 activationProgress = std::make_unique<ActivationProgress>(bus,
Gunnar Mills3fa38202017-10-08 17:07:43 -050056 path);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050057 }
58
Michael Tritzbed88af2017-07-19 16:00:06 -050059 if (!activationBlocksTransition)
60 {
61 activationBlocksTransition =
62 std::make_unique<ActivationBlocksTransition>(
63 bus,
64 path);
65 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050066
Michael Tritzbed88af2017-07-19 16:00:06 -050067 auto method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050068 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050069 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050070 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050071 "StartUnit");
72 method.append("obmc-flash-bmc-ubirw.service", "replace");
73 bus.call_noreply(method);
74
75 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId +
76 ".service";
77 method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050078 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050079 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050080 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050081 "StartUnit");
82 method.append(roServiceFile, "replace");
83 bus.call_noreply(method);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050084
85 activationProgress->progress(10);
Michael Tritzbed88af2017-07-19 16:00:06 -050086 }
87 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050088 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050089 activationProgress->progress(90);
90
Michael Tritzbed88af2017-07-19 16:00:06 -050091 if (!redundancyPriority)
92 {
93 redundancyPriority =
94 std::make_unique<RedundancyPriority>(
95 bus,
96 path,
97 *this,
98 0);
99 }
Saqib Khan4c1aec02017-07-06 11:46:13 -0500100
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500101 activationProgress->progress(100);
102
Michael Tritzbed88af2017-07-19 16:00:06 -0500103 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500104 activationProgress.reset(nullptr);
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500105
106 rwVolumeCreated = false;
107 roVolumeCreated = false;
108 Activation::unsubscribeFromSystemdSignals();
109
Saqib Khanee13e832017-10-23 12:53:11 -0500110 // Remove version object from image manager
111 Activation::deleteImageManagerObject();
112
Gunnar Millsded875d2017-08-28 16:44:52 -0500113 // Create active association
114 parent.createActiveAssociation(path);
115
Michael Tritzbed88af2017-07-19 16:00:06 -0500116 return softwareServer::Activation::activation(
117 softwareServer::Activation::Activations::Active);
118 }
Saqib Khanb0774702017-05-23 16:02:41 -0500119 }
120 else
121 {
122 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500123 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500124 }
125 return softwareServer::Activation::activation(value);
126}
127
Saqib Khanee13e832017-10-23 12:53:11 -0500128void Activation::deleteImageManagerObject()
129{
130 // Get the Delete object for <versionID> inside image_manager
131 auto method = this->bus.new_method_call(MAPPER_BUSNAME,
132 MAPPER_PATH,
133 MAPPER_INTERFACE,
134 "GetObject");
135 method.append(path);
136 method.append(std::vector<std::string>({
137 "xyz.openbmc_project.Object.Delete"}));
138 auto mapperResponseMsg = bus.call(method);
139 if (mapperResponseMsg.is_method_error())
140 {
141 log<level::ERR>("Error in Get Delete Object",
142 entry("VERSIONPATH=%s", path));
143 return;
144 }
145 std::map<std::string, std::vector<std::string>> mapperResponse;
146 mapperResponseMsg.read(mapperResponse);
147 if (mapperResponse.begin() == mapperResponse.end())
148 {
149 log<level::ERR>("ERROR in reading the mapper response",
150 entry("VERSIONPATH=%s", path));
151 return;
152 }
153
154 // Call the Delete object for <versionID> inside image_manager
155 method = this->bus.new_method_call((mapperResponse.begin()->first).c_str(),
156 path.c_str(),
157 "xyz.openbmc_project.Object.Delete",
158 "Delete");
159 mapperResponseMsg = bus.call(method);
160 //Check that the bus call didn't result in an error
161 if (mapperResponseMsg.is_method_error())
162 {
163 log<level::ERR>("Error in Deleting image from image manager",
164 entry("VERSIONPATH=%s", path));
165 return;
166 }
167}
168
Saqib Khanb0774702017-05-23 16:02:41 -0500169auto Activation::requestedActivation(RequestedActivations value) ->
170 RequestedActivations
171{
Michael Tritzbed88af2017-07-19 16:00:06 -0500172 rwVolumeCreated = false;
173 roVolumeCreated = false;
174
Saqib Khanb0774702017-05-23 16:02:41 -0500175 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
176 (softwareServer::Activation::requestedActivation() !=
177 softwareServer::Activation::RequestedActivations::Active))
178 {
179 if ((softwareServer::Activation::activation() ==
180 softwareServer::Activation::Activations::Ready) ||
181 (softwareServer::Activation::activation() ==
182 softwareServer::Activation::Activations::Failed))
183 {
184 Activation::activation(
185 softwareServer::Activation::Activations::Activating);
186
187 }
188 }
189 return softwareServer::Activation::requestedActivation(value);
190}
191
Saqib Khan4c1aec02017-07-06 11:46:13 -0500192uint8_t RedundancyPriority::priority(uint8_t value)
193{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500194 // Set the priority value so that the freePriority() function can order
195 // the versions by priority.
196 auto newPriority = softwareServer::RedundancyPriority::priority(value);
Saqib Khan5d532672017-08-09 10:44:50 -0500197 storeToFile(parent.versionId, value);
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500198 parent.parent.freePriority(value, parent.versionId);
199 return newPriority;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500200}
201
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500202uint8_t RedundancyPriority::sdbusPriority(uint8_t value)
Saqib Khanf0382c32017-10-24 13:36:22 -0500203{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500204 storeToFile(parent.versionId, value);
205 return softwareServer::RedundancyPriority::priority(value);
Saqib Khanf0382c32017-10-24 13:36:22 -0500206}
207
Michael Tritzbed88af2017-07-19 16:00:06 -0500208void Activation::unitStateChange(sdbusplus::message::message& msg)
209{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500210 if (softwareServer::Activation::activation() !=
211 softwareServer::Activation::Activations::Activating)
212 {
213 return;
214 }
215
Michael Tritzbed88af2017-07-19 16:00:06 -0500216 uint32_t newStateID {};
217 sdbusplus::message::object_path newStateObjPath;
218 std::string newStateUnit{};
219 std::string newStateResult{};
220
221 //Read the msg and populate each variable
222 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
223
224 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
225 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
226
Gunnar Mills3fa38202017-10-08 17:07:43 -0500227 if (newStateUnit == rwServiceFile && newStateResult == "done")
Michael Tritzbed88af2017-07-19 16:00:06 -0500228 {
229 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500230 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500231 }
232
Gunnar Mills3fa38202017-10-08 17:07:43 -0500233 if (newStateUnit == roServiceFile && newStateResult == "done")
Michael Tritzbed88af2017-07-19 16:00:06 -0500234 {
235 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500236 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500237 }
238
Gunnar Mills3fa38202017-10-08 17:07:43 -0500239 if (rwVolumeCreated && roVolumeCreated)
Michael Tritzbed88af2017-07-19 16:00:06 -0500240 {
241 Activation::activation(
242 softwareServer::Activation::Activations::Activating);
243 }
244
Gunnar Mills3fa38202017-10-08 17:07:43 -0500245 if ((newStateUnit == rwServiceFile || newStateUnit == roServiceFile) &&
Michael Tritzbed88af2017-07-19 16:00:06 -0500246 (newStateResult == "failed" || newStateResult == "dependency"))
247 {
248 Activation::activation(softwareServer::Activation::Activations::Failed);
249 }
250
251 return;
252}
253
254
Saqib Khanb0774702017-05-23 16:02:41 -0500255} // namespace updater
256} // namespace software
257} // namespace phosphor