blob: 823f1fb3bf8b1cf991fb8e1dbdbef2f22273ea4d [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{
Adriana Kobylak2285fe02018-02-27 15:36:59 -060020 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
21 SYSTEMD_INTERFACE, "Subscribe");
Michael Tritzbed88af2017-07-19 16:00:06 -050022 this->bus.call_noreply(method);
23
24 return;
25}
26
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050027void Activation::unsubscribeFromSystemdSignals()
28{
Adriana Kobylak2285fe02018-02-27 15:36:59 -060029 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
30 SYSTEMD_INTERFACE, "Unsubscribe");
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050031 this->bus.call_noreply(method);
32
33 return;
34}
35
Adriana Kobylak2285fe02018-02-27 15:36:59 -060036auto Activation::activation(Activations value) -> Activations
Saqib Khanb0774702017-05-23 16:02:41 -050037{
Saqib Khan4c1aec02017-07-06 11:46:13 -050038
Adriana Kobylak8bd84c82018-01-24 14:19:24 -060039 if ((value != softwareServer::Activation::Activations::Active) &&
40 (value != softwareServer::Activation::Activations::Activating))
Saqib Khan4c1aec02017-07-06 11:46:13 -050041 {
42 redundancyPriority.reset(nullptr);
43 }
44
Saqib Khanb0774702017-05-23 16:02:41 -050045 if (value == softwareServer::Activation::Activations::Activating)
46 {
Michael Tritzbed88af2017-07-19 16:00:06 -050047 if (rwVolumeCreated == false && roVolumeCreated == false)
Saqib Khanb0774702017-05-23 16:02:41 -050048 {
Adriana Kobylak204e1e72018-01-24 16:00:05 -060049 parent.freeSpace();
50
Michael Tritz0edd4ad2017-07-26 14:27:42 -050051 if (!activationProgress)
52 {
Adriana Kobylak2285fe02018-02-27 15:36:59 -060053 activationProgress =
54 std::make_unique<ActivationProgress>(bus, path);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050055 }
56
Michael Tritzbed88af2017-07-19 16:00:06 -050057 if (!activationBlocksTransition)
58 {
59 activationBlocksTransition =
Adriana Kobylak2285fe02018-02-27 15:36:59 -060060 std::make_unique<ActivationBlocksTransition>(bus, path);
Michael Tritzbed88af2017-07-19 16:00:06 -050061 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050062
Adriana Kobylak2285fe02018-02-27 15:36:59 -060063 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
64 SYSTEMD_INTERFACE, "StartUnit");
Michael Tritzbed88af2017-07-19 16:00:06 -050065 method.append("obmc-flash-bmc-ubirw.service", "replace");
66 bus.call_noreply(method);
67
Adriana Kobylak2285fe02018-02-27 15:36:59 -060068 auto roServiceFile =
69 "obmc-flash-bmc-ubiro@" + versionId + ".service";
70 method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
71 SYSTEMD_INTERFACE, "StartUnit");
Michael Tritzbed88af2017-07-19 16:00:06 -050072 method.append(roServiceFile, "replace");
73 bus.call_noreply(method);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050074
75 activationProgress->progress(10);
Michael Tritzbed88af2017-07-19 16:00:06 -050076 }
77 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050078 {
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060079 if (ubootEnvVarsUpdated == false)
Michael Tritzbed88af2017-07-19 16:00:06 -050080 {
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060081 activationProgress->progress(90);
82
83 if (!redundancyPriority)
84 {
Adriana Kobylak2285fe02018-02-27 15:36:59 -060085 redundancyPriority = std::make_unique<RedundancyPriority>(
86 bus, path, *this, 0);
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060087 }
Michael Tritzbed88af2017-07-19 16:00:06 -050088 }
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060089 else
90 {
91 activationProgress->progress(100);
Saqib Khan4c1aec02017-07-06 11:46:13 -050092
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060093 activationBlocksTransition.reset(nullptr);
94 activationProgress.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050095
Adriana Kobylak4c3edc92018-01-24 14:50:15 -060096 rwVolumeCreated = false;
97 roVolumeCreated = false;
98 ubootEnvVarsUpdated = false;
99 Activation::unsubscribeFromSystemdSignals();
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500100
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600101 // Remove version object from image manager
102 Activation::deleteImageManagerObject();
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500103
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600104 // Create active association
105 parent.createActiveAssociation(path);
Saqib Khanee13e832017-10-23 12:53:11 -0500106
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600107 return softwareServer::Activation::activation(
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600108 softwareServer::Activation::Activations::Active);
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600109 }
Michael Tritzbed88af2017-07-19 16:00:06 -0500110 }
Saqib Khanb0774702017-05-23 16:02:41 -0500111 }
112 else
113 {
114 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500115 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500116 }
117 return softwareServer::Activation::activation(value);
118}
119
Saqib Khanee13e832017-10-23 12:53:11 -0500120void Activation::deleteImageManagerObject()
121{
Saqib Khanee13e832017-10-23 12:53:11 -0500122 // Call the Delete object for <versionID> inside image_manager
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600123 auto method = this->bus.new_method_call(VERSION_BUSNAME, path.c_str(),
124 "xyz.openbmc_project.Object.Delete",
125 "Delete");
Adriana Kobylak00bd9022018-01-24 13:55:58 -0600126 auto mapperResponseMsg = bus.call(method);
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600127 // Check that the bus call didn't result in an error
Saqib Khanee13e832017-10-23 12:53:11 -0500128 if (mapperResponseMsg.is_method_error())
129 {
130 log<level::ERR>("Error in Deleting image from image manager",
Adriana Kobylak596466b2018-02-13 14:48:53 -0600131 entry("VERSIONPATH=%s", path.c_str()));
Saqib Khanee13e832017-10-23 12:53:11 -0500132 return;
133 }
134}
135
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600136auto Activation::requestedActivation(RequestedActivations value)
137 -> RequestedActivations
Saqib Khanb0774702017-05-23 16:02:41 -0500138{
Michael Tritzbed88af2017-07-19 16:00:06 -0500139 rwVolumeCreated = false;
140 roVolumeCreated = false;
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600141 ubootEnvVarsUpdated = false;
Michael Tritzbed88af2017-07-19 16:00:06 -0500142
Saqib Khanb0774702017-05-23 16:02:41 -0500143 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
144 (softwareServer::Activation::requestedActivation() !=
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600145 softwareServer::Activation::RequestedActivations::Active))
Saqib Khanb0774702017-05-23 16:02:41 -0500146 {
147 if ((softwareServer::Activation::activation() ==
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600148 softwareServer::Activation::Activations::Ready) ||
Saqib Khanb0774702017-05-23 16:02:41 -0500149 (softwareServer::Activation::activation() ==
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600150 softwareServer::Activation::Activations::Failed))
Saqib Khanb0774702017-05-23 16:02:41 -0500151 {
152 Activation::activation(
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600153 softwareServer::Activation::Activations::Activating);
Saqib Khanb0774702017-05-23 16:02:41 -0500154 }
155 }
156 return softwareServer::Activation::requestedActivation(value);
157}
158
Saqib Khan4c1aec02017-07-06 11:46:13 -0500159uint8_t RedundancyPriority::priority(uint8_t value)
160{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500161 // Set the priority value so that the freePriority() function can order
162 // the versions by priority.
163 auto newPriority = softwareServer::RedundancyPriority::priority(value);
Saqib Khan5d532672017-08-09 10:44:50 -0500164 storeToFile(parent.versionId, value);
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500165 parent.parent.freePriority(value, parent.versionId);
166 return newPriority;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500167}
168
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500169uint8_t RedundancyPriority::sdbusPriority(uint8_t value)
Saqib Khanf0382c32017-10-24 13:36:22 -0500170{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500171 storeToFile(parent.versionId, value);
172 return softwareServer::RedundancyPriority::priority(value);
Saqib Khanf0382c32017-10-24 13:36:22 -0500173}
174
Michael Tritzbed88af2017-07-19 16:00:06 -0500175void Activation::unitStateChange(sdbusplus::message::message& msg)
176{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500177 if (softwareServer::Activation::activation() !=
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600178 softwareServer::Activation::Activations::Activating)
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500179 {
180 return;
181 }
182
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600183 uint32_t newStateID{};
Michael Tritzbed88af2017-07-19 16:00:06 -0500184 sdbusplus::message::object_path newStateObjPath;
185 std::string newStateUnit{};
186 std::string newStateResult{};
187
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600188 // Read the msg and populate each variable
Michael Tritzbed88af2017-07-19 16:00:06 -0500189 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
190
191 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
192 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600193 auto ubootVarsServiceFile =
194 "obmc-flash-bmc-updateubootvars@" + versionId + ".service";
Michael Tritzbed88af2017-07-19 16:00:06 -0500195
Gunnar Mills3fa38202017-10-08 17:07:43 -0500196 if (newStateUnit == rwServiceFile && newStateResult == "done")
Michael Tritzbed88af2017-07-19 16:00:06 -0500197 {
198 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500199 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500200 }
201
Gunnar Mills3fa38202017-10-08 17:07:43 -0500202 if (newStateUnit == roServiceFile && newStateResult == "done")
Michael Tritzbed88af2017-07-19 16:00:06 -0500203 {
204 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500205 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500206 }
207
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600208 if (newStateUnit == ubootVarsServiceFile && newStateResult == "done")
209 {
210 ubootEnvVarsUpdated = true;
211 }
212
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600213 if (newStateUnit == rwServiceFile || newStateUnit == roServiceFile ||
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600214 newStateUnit == ubootVarsServiceFile)
Michael Tritzbed88af2017-07-19 16:00:06 -0500215 {
Adriana Kobylak8bd84c82018-01-24 14:19:24 -0600216 if (newStateResult == "failed" || newStateResult == "dependency")
217 {
218 Activation::activation(
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600219 softwareServer::Activation::Activations::Failed);
Adriana Kobylak8bd84c82018-01-24 14:19:24 -0600220 }
Adriana Kobylak4c3edc92018-01-24 14:50:15 -0600221 else if ((rwVolumeCreated && roVolumeCreated) || // Volumes were created
222 (ubootEnvVarsUpdated)) // Enviroment variables were updated
Adriana Kobylak8bd84c82018-01-24 14:19:24 -0600223 {
224 Activation::activation(
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600225 softwareServer::Activation::Activations::Activating);
Adriana Kobylak8bd84c82018-01-24 14:19:24 -0600226 }
Michael Tritzbed88af2017-07-19 16:00:06 -0500227 }
228
229 return;
230}
231
Saqib Khanf37cefc2017-09-12 08:44:41 -0500232void ActivationBlocksTransition::enableRebootGuard()
233{
234 log<level::INFO>("BMC image activating - BMC reboots are disabled.");
235
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600236 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
237 SYSTEMD_INTERFACE, "StartUnit");
Saqib Khanf37cefc2017-09-12 08:44:41 -0500238 method.append("reboot-guard-enable.service", "replace");
239 bus.call_noreply(method);
240}
241
242void ActivationBlocksTransition::disableRebootGuard()
243{
244 log<level::INFO>("BMC activation has ended - BMC reboots are re-enabled.");
245
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600246 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
247 SYSTEMD_INTERFACE, "StartUnit");
Saqib Khanf37cefc2017-09-12 08:44:41 -0500248 method.append("reboot-guard-disable.service", "replace");
249 bus.call_noreply(method);
250}
Michael Tritzbed88af2017-07-19 16:00:06 -0500251
Saqib Khanb0774702017-05-23 16:02:41 -0500252} // namespace updater
253} // namespace software
254} // namespace phosphor