blob: 8dc4d38c6c0d7400896cfe4c0cc54db472b1c9ec [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 Khanb0774702017-05-23 16:02:41 -05005
6namespace phosphor
7{
8namespace software
9{
10namespace updater
11{
12
13namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server;
14
Michael Tritzbed88af2017-07-19 16:00:06 -050015void Activation::subscribeToSystemdSignals()
16{
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050017 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050018 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050019 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050020 "Subscribe");
21 this->bus.call_noreply(method);
22
23 return;
24}
25
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050026void Activation::unsubscribeFromSystemdSignals()
27{
28 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME,
29 SYSTEMD_PATH,
30 SYSTEMD_INTERFACE,
31 "Unsubscribe");
32 this->bus.call_noreply(method);
33
34 return;
35}
36
Saqib Khanb0774702017-05-23 16:02:41 -050037auto Activation::activation(Activations value) ->
38 Activations
39{
Saqib Khan4c1aec02017-07-06 11:46:13 -050040
41 if (value != softwareServer::Activation::Activations::Active)
42 {
43 redundancyPriority.reset(nullptr);
44 }
45
Saqib Khanb0774702017-05-23 16:02:41 -050046 if (value == softwareServer::Activation::Activations::Activating)
47 {
Michael Tritzbed88af2017-07-19 16:00:06 -050048 if (rwVolumeCreated == false && roVolumeCreated == false)
Saqib Khanb0774702017-05-23 16:02:41 -050049 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050050 if (!activationProgress)
51 {
52 activationProgress = std::make_unique<ActivationProgress>(bus,
53 path);
54 }
55
Michael Tritzbed88af2017-07-19 16:00:06 -050056 if (!activationBlocksTransition)
57 {
58 activationBlocksTransition =
59 std::make_unique<ActivationBlocksTransition>(
60 bus,
61 path);
62 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050063
Michael Tritzbed88af2017-07-19 16:00:06 -050064 auto method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050065 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050066 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050067 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050068 "StartUnit");
69 method.append("obmc-flash-bmc-ubirw.service", "replace");
70 bus.call_noreply(method);
71
72 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId +
73 ".service";
74 method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050075 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050076 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050077 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050078 "StartUnit");
79 method.append(roServiceFile, "replace");
80 bus.call_noreply(method);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050081
82 activationProgress->progress(10);
Michael Tritzbed88af2017-07-19 16:00:06 -050083 }
84 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050085 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050086 activationProgress->progress(90);
87
Michael Tritzbed88af2017-07-19 16:00:06 -050088 if (!redundancyPriority)
89 {
90 redundancyPriority =
91 std::make_unique<RedundancyPriority>(
92 bus,
93 path,
94 *this,
95 0);
96 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050097
Michael Tritz0edd4ad2017-07-26 14:27:42 -050098 activationProgress->progress(100);
99
Michael Tritzbed88af2017-07-19 16:00:06 -0500100 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500101 activationProgress.reset(nullptr);
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500102
103 rwVolumeCreated = false;
104 roVolumeCreated = false;
105 Activation::unsubscribeFromSystemdSignals();
106
Michael Tritzbed88af2017-07-19 16:00:06 -0500107 return softwareServer::Activation::activation(
108 softwareServer::Activation::Activations::Active);
109 }
Saqib Khanb0774702017-05-23 16:02:41 -0500110 }
111 else
112 {
113 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500114 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500115 }
116 return softwareServer::Activation::activation(value);
117}
118
119auto Activation::requestedActivation(RequestedActivations value) ->
120 RequestedActivations
121{
Michael Tritzbed88af2017-07-19 16:00:06 -0500122 rwVolumeCreated = false;
123 roVolumeCreated = false;
124
Saqib Khanb0774702017-05-23 16:02:41 -0500125 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
126 (softwareServer::Activation::requestedActivation() !=
127 softwareServer::Activation::RequestedActivations::Active))
128 {
129 if ((softwareServer::Activation::activation() ==
130 softwareServer::Activation::Activations::Ready) ||
131 (softwareServer::Activation::activation() ==
132 softwareServer::Activation::Activations::Failed))
133 {
134 Activation::activation(
135 softwareServer::Activation::Activations::Activating);
136
137 }
138 }
139 return softwareServer::Activation::requestedActivation(value);
140}
141
Saqib Khan4c1aec02017-07-06 11:46:13 -0500142uint8_t RedundancyPriority::priority(uint8_t value)
143{
144 parent.parent.freePriority(value);
Saqib Khan5d532672017-08-09 10:44:50 -0500145 storeToFile(parent.versionId, value);
Saqib Khan4c1aec02017-07-06 11:46:13 -0500146 return softwareServer::RedundancyPriority::priority(value);
147}
148
Michael Tritzbed88af2017-07-19 16:00:06 -0500149void Activation::unitStateChange(sdbusplus::message::message& msg)
150{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500151 if (softwareServer::Activation::activation() !=
152 softwareServer::Activation::Activations::Activating)
153 {
154 return;
155 }
156
Michael Tritzbed88af2017-07-19 16:00:06 -0500157 uint32_t newStateID {};
158 sdbusplus::message::object_path newStateObjPath;
159 std::string newStateUnit{};
160 std::string newStateResult{};
161
162 //Read the msg and populate each variable
163 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
164
165 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
166 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
167
168 if(newStateUnit == rwServiceFile && newStateResult == "done")
169 {
170 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500171 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500172 }
173
174 if(newStateUnit == roServiceFile && newStateResult == "done")
175 {
176 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500177 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500178 }
179
180 if(rwVolumeCreated && roVolumeCreated)
181 {
182 Activation::activation(
183 softwareServer::Activation::Activations::Activating);
184 }
185
186 if((newStateUnit == rwServiceFile || newStateUnit == roServiceFile) &&
187 (newStateResult == "failed" || newStateResult == "dependency"))
188 {
189 Activation::activation(softwareServer::Activation::Activations::Failed);
190 }
191
192 return;
193}
194
195
Saqib Khanb0774702017-05-23 16:02:41 -0500196} // namespace updater
197} // namespace software
198} // namespace phosphor