blob: 8f7d8a1de29c368e0609d1e5434ca0385e8f0843 [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
Adriana Kobylak8bd84c82018-01-24 14:19:24 -060044 if ((value != softwareServer::Activation::Activations::Active) &&
45 (value != softwareServer::Activation::Activations::Activating))
Saqib Khan4c1aec02017-07-06 11:46:13 -050046 {
47 redundancyPriority.reset(nullptr);
48 }
49
Saqib Khanb0774702017-05-23 16:02:41 -050050 if (value == softwareServer::Activation::Activations::Activating)
51 {
Michael Tritzbed88af2017-07-19 16:00:06 -050052 if (rwVolumeCreated == false && roVolumeCreated == false)
Saqib Khanb0774702017-05-23 16:02:41 -050053 {
Adriana Kobylak204e1e72018-01-24 16:00:05 -060054 parent.freeSpace();
55
Michael Tritz0edd4ad2017-07-26 14:27:42 -050056 if (!activationProgress)
57 {
58 activationProgress = std::make_unique<ActivationProgress>(bus,
Gunnar Mills3fa38202017-10-08 17:07:43 -050059 path);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050060 }
61
Michael Tritzbed88af2017-07-19 16:00:06 -050062 if (!activationBlocksTransition)
63 {
64 activationBlocksTransition =
65 std::make_unique<ActivationBlocksTransition>(
66 bus,
67 path);
68 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050069
Michael Tritzbed88af2017-07-19 16:00:06 -050070 auto method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050071 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050072 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050073 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050074 "StartUnit");
75 method.append("obmc-flash-bmc-ubirw.service", "replace");
76 bus.call_noreply(method);
77
78 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId +
79 ".service";
80 method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050081 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050082 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050083 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050084 "StartUnit");
85 method.append(roServiceFile, "replace");
86 bus.call_noreply(method);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050087
88 activationProgress->progress(10);
Michael Tritzbed88af2017-07-19 16:00:06 -050089 }
90 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050091 {
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060092 if (ubootEnvVarsUpdated == false)
Michael Tritzbed88af2017-07-19 16:00:06 -050093 {
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060094 activationProgress->progress(90);
95
96 if (!redundancyPriority)
97 {
98 redundancyPriority =
99 std::make_unique<RedundancyPriority>(
100 bus,
101 path,
102 *this,
103 0);
104 }
Michael Tritzbed88af2017-07-19 16:00:06 -0500105 }
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600106 else
107 {
108 activationProgress->progress(100);
Saqib Khan4c1aec02017-07-06 11:46:13 -0500109
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600110 activationBlocksTransition.reset(nullptr);
111 activationProgress.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500112
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600113 rwVolumeCreated = false;
114 roVolumeCreated = false;
115 ubootEnvVarsUpdated = false;
116 Activation::unsubscribeFromSystemdSignals();
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500117
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600118 // Remove version object from image manager
119 Activation::deleteImageManagerObject();
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500120
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600121 // Create active association
122 parent.createActiveAssociation(path);
Saqib Khanee13e832017-10-23 12:53:11 -0500123
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600124 return softwareServer::Activation::activation(
125 softwareServer::Activation::Activations::Active);
126 }
Michael Tritzbed88af2017-07-19 16:00:06 -0500127 }
Saqib Khanb0774702017-05-23 16:02:41 -0500128 }
129 else
130 {
131 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500132 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500133 }
134 return softwareServer::Activation::activation(value);
135}
136
Saqib Khanee13e832017-10-23 12:53:11 -0500137void Activation::deleteImageManagerObject()
138{
Saqib Khanee13e832017-10-23 12:53:11 -0500139 // Call the Delete object for <versionID> inside image_manager
Adriana Kobylak00bd9022018-01-24 13:55:58 -0600140 auto method = this->bus.new_method_call(VERSION_BUSNAME,
Saqib Khanee13e832017-10-23 12:53:11 -0500141 path.c_str(),
142 "xyz.openbmc_project.Object.Delete",
143 "Delete");
Adriana Kobylak00bd9022018-01-24 13:55:58 -0600144 auto mapperResponseMsg = bus.call(method);
Saqib Khanee13e832017-10-23 12:53:11 -0500145 //Check that the bus call didn't result in an error
146 if (mapperResponseMsg.is_method_error())
147 {
148 log<level::ERR>("Error in Deleting image from image manager",
Adriana Kobylak596466b2018-02-13 14:48:53 -0600149 entry("VERSIONPATH=%s", path.c_str()));
Saqib Khanee13e832017-10-23 12:53:11 -0500150 return;
151 }
152}
153
Saqib Khanb0774702017-05-23 16:02:41 -0500154auto Activation::requestedActivation(RequestedActivations value) ->
155 RequestedActivations
156{
Michael Tritzbed88af2017-07-19 16:00:06 -0500157 rwVolumeCreated = false;
158 roVolumeCreated = false;
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600159 ubootEnvVarsUpdated = false;
Michael Tritzbed88af2017-07-19 16:00:06 -0500160
Saqib Khanb0774702017-05-23 16:02:41 -0500161 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
162 (softwareServer::Activation::requestedActivation() !=
163 softwareServer::Activation::RequestedActivations::Active))
164 {
165 if ((softwareServer::Activation::activation() ==
166 softwareServer::Activation::Activations::Ready) ||
167 (softwareServer::Activation::activation() ==
168 softwareServer::Activation::Activations::Failed))
169 {
170 Activation::activation(
171 softwareServer::Activation::Activations::Activating);
172
173 }
174 }
175 return softwareServer::Activation::requestedActivation(value);
176}
177
Saqib Khan4c1aec02017-07-06 11:46:13 -0500178uint8_t RedundancyPriority::priority(uint8_t value)
179{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500180 // Set the priority value so that the freePriority() function can order
181 // the versions by priority.
182 auto newPriority = softwareServer::RedundancyPriority::priority(value);
Saqib Khan5d532672017-08-09 10:44:50 -0500183 storeToFile(parent.versionId, value);
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500184 parent.parent.freePriority(value, parent.versionId);
185 return newPriority;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500186}
187
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500188uint8_t RedundancyPriority::sdbusPriority(uint8_t value)
Saqib Khanf0382c32017-10-24 13:36:22 -0500189{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500190 storeToFile(parent.versionId, value);
191 return softwareServer::RedundancyPriority::priority(value);
Saqib Khanf0382c32017-10-24 13:36:22 -0500192}
193
Michael Tritzbed88af2017-07-19 16:00:06 -0500194void Activation::unitStateChange(sdbusplus::message::message& msg)
195{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500196 if (softwareServer::Activation::activation() !=
197 softwareServer::Activation::Activations::Activating)
198 {
199 return;
200 }
201
Michael Tritzbed88af2017-07-19 16:00:06 -0500202 uint32_t newStateID {};
203 sdbusplus::message::object_path newStateObjPath;
204 std::string newStateUnit{};
205 std::string newStateResult{};
206
207 //Read the msg and populate each variable
208 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
209
210 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
211 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600212 auto ubootVarsServiceFile = "obmc-flash-bmc-updateubootvars@" + versionId +
213 ".service";
Michael Tritzbed88af2017-07-19 16:00:06 -0500214
Gunnar Mills3fa38202017-10-08 17:07:43 -0500215 if (newStateUnit == rwServiceFile && newStateResult == "done")
Michael Tritzbed88af2017-07-19 16:00:06 -0500216 {
217 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500218 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500219 }
220
Gunnar Mills3fa38202017-10-08 17:07:43 -0500221 if (newStateUnit == roServiceFile && newStateResult == "done")
Michael Tritzbed88af2017-07-19 16:00:06 -0500222 {
223 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500224 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500225 }
226
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600227 if (newStateUnit == ubootVarsServiceFile && newStateResult == "done")
228 {
229 ubootEnvVarsUpdated = true;
230 }
231
232 if (newStateUnit == rwServiceFile ||
233 newStateUnit == roServiceFile ||
234 newStateUnit == ubootVarsServiceFile)
Michael Tritzbed88af2017-07-19 16:00:06 -0500235 {
Adriana Kobylak8bd84c82018-01-24 14:19:24 -0600236 if (newStateResult == "failed" || newStateResult == "dependency")
237 {
238 Activation::activation(
239 softwareServer::Activation::Activations::Failed);
240 }
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600241 else if ((rwVolumeCreated && roVolumeCreated) || // Volumes were created
242 (ubootEnvVarsUpdated)) // Enviroment variables were updated
Adriana Kobylak8bd84c82018-01-24 14:19:24 -0600243 {
244 Activation::activation(
245 softwareServer::Activation::Activations::Activating);
246 }
Michael Tritzbed88af2017-07-19 16:00:06 -0500247 }
248
249 return;
250}
251
252
Saqib Khanb0774702017-05-23 16:02:41 -0500253} // namespace updater
254} // namespace software
255} // namespace phosphor