blob: af8f1e950ff4a408eda97d7a10871171798e2d38 [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
Gunnar Millsded875d2017-08-28 16:44:52 -0500107 // Create active association
108 parent.createActiveAssociation(path);
109
Michael Tritzbed88af2017-07-19 16:00:06 -0500110 return softwareServer::Activation::activation(
111 softwareServer::Activation::Activations::Active);
112 }
Saqib Khanb0774702017-05-23 16:02:41 -0500113 }
114 else
115 {
116 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500117 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500118 }
119 return softwareServer::Activation::activation(value);
120}
121
122auto Activation::requestedActivation(RequestedActivations value) ->
123 RequestedActivations
124{
Michael Tritzbed88af2017-07-19 16:00:06 -0500125 rwVolumeCreated = false;
126 roVolumeCreated = false;
127
Saqib Khanb0774702017-05-23 16:02:41 -0500128 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
129 (softwareServer::Activation::requestedActivation() !=
130 softwareServer::Activation::RequestedActivations::Active))
131 {
132 if ((softwareServer::Activation::activation() ==
133 softwareServer::Activation::Activations::Ready) ||
134 (softwareServer::Activation::activation() ==
135 softwareServer::Activation::Activations::Failed))
136 {
137 Activation::activation(
138 softwareServer::Activation::Activations::Activating);
139
140 }
141 }
142 return softwareServer::Activation::requestedActivation(value);
143}
144
Saqib Khan4c1aec02017-07-06 11:46:13 -0500145uint8_t RedundancyPriority::priority(uint8_t value)
146{
147 parent.parent.freePriority(value);
Saqib Khan5d532672017-08-09 10:44:50 -0500148 storeToFile(parent.versionId, value);
Saqib Khan4c1aec02017-07-06 11:46:13 -0500149 return softwareServer::RedundancyPriority::priority(value);
150}
151
Michael Tritzbed88af2017-07-19 16:00:06 -0500152void Activation::unitStateChange(sdbusplus::message::message& msg)
153{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500154 if (softwareServer::Activation::activation() !=
155 softwareServer::Activation::Activations::Activating)
156 {
157 return;
158 }
159
Michael Tritzbed88af2017-07-19 16:00:06 -0500160 uint32_t newStateID {};
161 sdbusplus::message::object_path newStateObjPath;
162 std::string newStateUnit{};
163 std::string newStateResult{};
164
165 //Read the msg and populate each variable
166 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
167
168 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
169 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
170
171 if(newStateUnit == rwServiceFile && newStateResult == "done")
172 {
173 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500174 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500175 }
176
177 if(newStateUnit == roServiceFile && newStateResult == "done")
178 {
179 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500180 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500181 }
182
183 if(rwVolumeCreated && roVolumeCreated)
184 {
185 Activation::activation(
186 softwareServer::Activation::Activations::Activating);
187 }
188
189 if((newStateUnit == rwServiceFile || newStateUnit == roServiceFile) &&
190 (newStateResult == "failed" || newStateResult == "dependency"))
191 {
192 Activation::activation(softwareServer::Activation::Activations::Failed);
193 }
194
195 return;
196}
197
198
Saqib Khanb0774702017-05-23 16:02:41 -0500199} // namespace updater
200} // namespace software
201} // namespace phosphor