blob: 64fd53ee58fa59623861f73a2fc18f18bcaa1d32 [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 Khanb0774702017-05-23 16:02:41 -05004
5namespace phosphor
6{
7namespace software
8{
9namespace updater
10{
11
12namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server;
13
Michael Tritzbed88af2017-07-19 16:00:06 -050014void Activation::subscribeToSystemdSignals()
15{
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050016 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050017 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050018 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050019 "Subscribe");
20 this->bus.call_noreply(method);
21
22 return;
23}
24
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050025void Activation::unsubscribeFromSystemdSignals()
26{
27 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME,
28 SYSTEMD_PATH,
29 SYSTEMD_INTERFACE,
30 "Unsubscribe");
31 this->bus.call_noreply(method);
32
33 return;
34}
35
Saqib Khanb0774702017-05-23 16:02:41 -050036auto Activation::activation(Activations value) ->
37 Activations
38{
Saqib Khan4c1aec02017-07-06 11:46:13 -050039
40 if (value != softwareServer::Activation::Activations::Active)
41 {
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 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050049 if (!activationProgress)
50 {
51 activationProgress = std::make_unique<ActivationProgress>(bus,
52 path);
53 }
54
Michael Tritzbed88af2017-07-19 16:00:06 -050055 if (!activationBlocksTransition)
56 {
57 activationBlocksTransition =
58 std::make_unique<ActivationBlocksTransition>(
59 bus,
60 path);
61 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050062
Michael Tritzbed88af2017-07-19 16:00:06 -050063 auto method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050064 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050065 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050066 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050067 "StartUnit");
68 method.append("obmc-flash-bmc-ubirw.service", "replace");
69 bus.call_noreply(method);
70
71 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId +
72 ".service";
73 method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050074 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050075 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050076 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050077 "StartUnit");
78 method.append(roServiceFile, "replace");
79 bus.call_noreply(method);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050080
81 activationProgress->progress(10);
Michael Tritzbed88af2017-07-19 16:00:06 -050082 }
83 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050084 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050085 activationProgress->progress(90);
86
Michael Tritzbed88af2017-07-19 16:00:06 -050087 if (!redundancyPriority)
88 {
89 redundancyPriority =
90 std::make_unique<RedundancyPriority>(
91 bus,
92 path,
93 *this,
94 0);
95 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050096
Michael Tritz0edd4ad2017-07-26 14:27:42 -050097 activationProgress->progress(100);
98
Michael Tritzbed88af2017-07-19 16:00:06 -050099 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500100 activationProgress.reset(nullptr);
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500101
102 rwVolumeCreated = false;
103 roVolumeCreated = false;
104 Activation::unsubscribeFromSystemdSignals();
105
Michael Tritzbed88af2017-07-19 16:00:06 -0500106 return softwareServer::Activation::activation(
107 softwareServer::Activation::Activations::Active);
108 }
Saqib Khanb0774702017-05-23 16:02:41 -0500109 }
110 else
111 {
112 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500113 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500114 }
115 return softwareServer::Activation::activation(value);
116}
117
118auto Activation::requestedActivation(RequestedActivations value) ->
119 RequestedActivations
120{
Michael Tritzbed88af2017-07-19 16:00:06 -0500121 rwVolumeCreated = false;
122 roVolumeCreated = false;
123
Saqib Khanb0774702017-05-23 16:02:41 -0500124 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
125 (softwareServer::Activation::requestedActivation() !=
126 softwareServer::Activation::RequestedActivations::Active))
127 {
128 if ((softwareServer::Activation::activation() ==
129 softwareServer::Activation::Activations::Ready) ||
130 (softwareServer::Activation::activation() ==
131 softwareServer::Activation::Activations::Failed))
132 {
133 Activation::activation(
134 softwareServer::Activation::Activations::Activating);
135
136 }
137 }
138 return softwareServer::Activation::requestedActivation(value);
139}
140
Saqib Khan4c1aec02017-07-06 11:46:13 -0500141uint8_t RedundancyPriority::priority(uint8_t value)
142{
143 parent.parent.freePriority(value);
144 return softwareServer::RedundancyPriority::priority(value);
145}
146
Michael Tritzbed88af2017-07-19 16:00:06 -0500147void Activation::unitStateChange(sdbusplus::message::message& msg)
148{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500149 if (softwareServer::Activation::activation() !=
150 softwareServer::Activation::Activations::Activating)
151 {
152 return;
153 }
154
Michael Tritzbed88af2017-07-19 16:00:06 -0500155 uint32_t newStateID {};
156 sdbusplus::message::object_path newStateObjPath;
157 std::string newStateUnit{};
158 std::string newStateResult{};
159
160 //Read the msg and populate each variable
161 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
162
163 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
164 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
165
166 if(newStateUnit == rwServiceFile && newStateResult == "done")
167 {
168 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500169 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500170 }
171
172 if(newStateUnit == roServiceFile && newStateResult == "done")
173 {
174 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500175 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500176 }
177
178 if(rwVolumeCreated && roVolumeCreated)
179 {
180 Activation::activation(
181 softwareServer::Activation::Activations::Activating);
182 }
183
184 if((newStateUnit == rwServiceFile || newStateUnit == roServiceFile) &&
185 (newStateResult == "failed" || newStateResult == "dependency"))
186 {
187 Activation::activation(softwareServer::Activation::Activations::Failed);
188 }
189
190 return;
191}
192
193
Saqib Khanb0774702017-05-23 16:02:41 -0500194} // namespace updater
195} // namespace software
196} // namespace phosphor