blob: 9d2ba4a2a1751e5e58767b9074dac020d5ee494c [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
Eddie James9440f492017-08-30 11:34:16 -050037void Activation::delete_()
38{
39 parent.erase(versionId);
40}
41
Saqib Khanb0774702017-05-23 16:02:41 -050042auto Activation::activation(Activations value) ->
43 Activations
44{
Saqib Khan4c1aec02017-07-06 11:46:13 -050045
46 if (value != softwareServer::Activation::Activations::Active)
47 {
48 redundancyPriority.reset(nullptr);
49 }
50
Saqib Khanb0774702017-05-23 16:02:41 -050051 if (value == softwareServer::Activation::Activations::Activating)
52 {
Michael Tritzbed88af2017-07-19 16:00:06 -050053 if (rwVolumeCreated == false && roVolumeCreated == false)
Saqib Khanb0774702017-05-23 16:02:41 -050054 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050055 if (!activationProgress)
56 {
57 activationProgress = std::make_unique<ActivationProgress>(bus,
58 path);
59 }
60
Michael Tritzbed88af2017-07-19 16:00:06 -050061 if (!activationBlocksTransition)
62 {
63 activationBlocksTransition =
64 std::make_unique<ActivationBlocksTransition>(
65 bus,
66 path);
67 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050068
Michael Tritzbed88af2017-07-19 16:00:06 -050069 auto method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050070 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050071 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050072 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050073 "StartUnit");
74 method.append("obmc-flash-bmc-ubirw.service", "replace");
75 bus.call_noreply(method);
76
77 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId +
78 ".service";
79 method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050080 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050081 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050082 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050083 "StartUnit");
84 method.append(roServiceFile, "replace");
85 bus.call_noreply(method);
Michael Tritz0edd4ad2017-07-26 14:27:42 -050086
87 activationProgress->progress(10);
Michael Tritzbed88af2017-07-19 16:00:06 -050088 }
89 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050090 {
Michael Tritz0edd4ad2017-07-26 14:27:42 -050091 activationProgress->progress(90);
92
Michael Tritzbed88af2017-07-19 16:00:06 -050093 if (!redundancyPriority)
94 {
95 redundancyPriority =
96 std::make_unique<RedundancyPriority>(
97 bus,
98 path,
99 *this,
100 0);
101 }
Saqib Khan4c1aec02017-07-06 11:46:13 -0500102
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500103 activationProgress->progress(100);
104
Michael Tritzbed88af2017-07-19 16:00:06 -0500105 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500106 activationProgress.reset(nullptr);
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500107
108 rwVolumeCreated = false;
109 roVolumeCreated = false;
110 Activation::unsubscribeFromSystemdSignals();
111
Gunnar Millsded875d2017-08-28 16:44:52 -0500112 // Create active association
113 parent.createActiveAssociation(path);
114
Michael Tritzbed88af2017-07-19 16:00:06 -0500115 return softwareServer::Activation::activation(
116 softwareServer::Activation::Activations::Active);
117 }
Saqib Khanb0774702017-05-23 16:02:41 -0500118 }
119 else
120 {
121 activationBlocksTransition.reset(nullptr);
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500122 activationProgress.reset(nullptr);
Saqib Khanb0774702017-05-23 16:02:41 -0500123 }
124 return softwareServer::Activation::activation(value);
125}
126
127auto Activation::requestedActivation(RequestedActivations value) ->
128 RequestedActivations
129{
Michael Tritzbed88af2017-07-19 16:00:06 -0500130 rwVolumeCreated = false;
131 roVolumeCreated = false;
132
Saqib Khanb0774702017-05-23 16:02:41 -0500133 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
134 (softwareServer::Activation::requestedActivation() !=
135 softwareServer::Activation::RequestedActivations::Active))
136 {
137 if ((softwareServer::Activation::activation() ==
138 softwareServer::Activation::Activations::Ready) ||
139 (softwareServer::Activation::activation() ==
140 softwareServer::Activation::Activations::Failed))
141 {
142 Activation::activation(
143 softwareServer::Activation::Activations::Activating);
144
145 }
146 }
147 return softwareServer::Activation::requestedActivation(value);
148}
149
Saqib Khan4c1aec02017-07-06 11:46:13 -0500150uint8_t RedundancyPriority::priority(uint8_t value)
151{
152 parent.parent.freePriority(value);
Saqib Khan5d532672017-08-09 10:44:50 -0500153 storeToFile(parent.versionId, value);
Saqib Khan4c1aec02017-07-06 11:46:13 -0500154 return softwareServer::RedundancyPriority::priority(value);
155}
156
Michael Tritzbed88af2017-07-19 16:00:06 -0500157void Activation::unitStateChange(sdbusplus::message::message& msg)
158{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500159 if (softwareServer::Activation::activation() !=
160 softwareServer::Activation::Activations::Activating)
161 {
162 return;
163 }
164
Michael Tritzbed88af2017-07-19 16:00:06 -0500165 uint32_t newStateID {};
166 sdbusplus::message::object_path newStateObjPath;
167 std::string newStateUnit{};
168 std::string newStateResult{};
169
170 //Read the msg and populate each variable
171 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
172
173 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
174 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
175
176 if(newStateUnit == rwServiceFile && newStateResult == "done")
177 {
178 rwVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500179 activationProgress->progress(activationProgress->progress() + 20);
Michael Tritzbed88af2017-07-19 16:00:06 -0500180 }
181
182 if(newStateUnit == roServiceFile && newStateResult == "done")
183 {
184 roVolumeCreated = true;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500185 activationProgress->progress(activationProgress->progress() + 50);
Michael Tritzbed88af2017-07-19 16:00:06 -0500186 }
187
188 if(rwVolumeCreated && roVolumeCreated)
189 {
190 Activation::activation(
191 softwareServer::Activation::Activations::Activating);
192 }
193
194 if((newStateUnit == rwServiceFile || newStateUnit == roServiceFile) &&
195 (newStateResult == "failed" || newStateResult == "dependency"))
196 {
197 Activation::activation(softwareServer::Activation::Activations::Failed);
198 }
199
200 return;
201}
202
203
Saqib Khanb0774702017-05-23 16:02:41 -0500204} // namespace updater
205} // namespace software
206} // namespace phosphor