blob: 2a8c122d496073457de9565a41a119bab442a53e [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 Tritzbed88af2017-07-19 16:00:06 -050049 if (!activationBlocksTransition)
50 {
51 activationBlocksTransition =
52 std::make_unique<ActivationBlocksTransition>(
53 bus,
54 path);
55 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050056
Michael Tritzbed88af2017-07-19 16:00:06 -050057 auto method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050058 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050059 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050060 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050061 "StartUnit");
62 method.append("obmc-flash-bmc-ubirw.service", "replace");
63 bus.call_noreply(method);
64
65 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId +
66 ".service";
67 method = bus.new_method_call(
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050068 SYSTEMD_BUSNAME,
Michael Tritzbed88af2017-07-19 16:00:06 -050069 SYSTEMD_PATH,
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050070 SYSTEMD_INTERFACE,
Michael Tritzbed88af2017-07-19 16:00:06 -050071 "StartUnit");
72 method.append(roServiceFile, "replace");
73 bus.call_noreply(method);
74 }
75 else if (rwVolumeCreated == true && roVolumeCreated == true)
Saqib Khan4c1aec02017-07-06 11:46:13 -050076 {
Michael Tritzbed88af2017-07-19 16:00:06 -050077 if (!redundancyPriority)
78 {
79 redundancyPriority =
80 std::make_unique<RedundancyPriority>(
81 bus,
82 path,
83 *this,
84 0);
85 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050086
Michael Tritzbed88af2017-07-19 16:00:06 -050087 activationBlocksTransition.reset(nullptr);
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050088
89 rwVolumeCreated = false;
90 roVolumeCreated = false;
91 Activation::unsubscribeFromSystemdSignals();
92
Michael Tritzbed88af2017-07-19 16:00:06 -050093 return softwareServer::Activation::activation(
94 softwareServer::Activation::Activations::Active);
95 }
Saqib Khanb0774702017-05-23 16:02:41 -050096 }
97 else
98 {
99 activationBlocksTransition.reset(nullptr);
100 }
101 return softwareServer::Activation::activation(value);
102}
103
104auto Activation::requestedActivation(RequestedActivations value) ->
105 RequestedActivations
106{
Michael Tritzbed88af2017-07-19 16:00:06 -0500107 rwVolumeCreated = false;
108 roVolumeCreated = false;
109
Saqib Khanb0774702017-05-23 16:02:41 -0500110 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
111 (softwareServer::Activation::requestedActivation() !=
112 softwareServer::Activation::RequestedActivations::Active))
113 {
114 if ((softwareServer::Activation::activation() ==
115 softwareServer::Activation::Activations::Ready) ||
116 (softwareServer::Activation::activation() ==
117 softwareServer::Activation::Activations::Failed))
118 {
119 Activation::activation(
120 softwareServer::Activation::Activations::Activating);
121
122 }
123 }
124 return softwareServer::Activation::requestedActivation(value);
125}
126
Saqib Khan4c1aec02017-07-06 11:46:13 -0500127uint8_t RedundancyPriority::priority(uint8_t value)
128{
129 parent.parent.freePriority(value);
130 return softwareServer::RedundancyPriority::priority(value);
131}
132
Michael Tritzbed88af2017-07-19 16:00:06 -0500133void Activation::unitStateChange(sdbusplus::message::message& msg)
134{
135 uint32_t newStateID {};
136 sdbusplus::message::object_path newStateObjPath;
137 std::string newStateUnit{};
138 std::string newStateResult{};
139
140 //Read the msg and populate each variable
141 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
142
143 auto rwServiceFile = "obmc-flash-bmc-ubirw.service";
144 auto roServiceFile = "obmc-flash-bmc-ubiro@" + versionId + ".service";
145
146 if(newStateUnit == rwServiceFile && newStateResult == "done")
147 {
148 rwVolumeCreated = true;
149 }
150
151 if(newStateUnit == roServiceFile && newStateResult == "done")
152 {
153 roVolumeCreated = true;
154 }
155
156 if(rwVolumeCreated && roVolumeCreated)
157 {
158 Activation::activation(
159 softwareServer::Activation::Activations::Activating);
160 }
161
162 if((newStateUnit == rwServiceFile || newStateUnit == roServiceFile) &&
163 (newStateResult == "failed" || newStateResult == "dependency"))
164 {
165 Activation::activation(softwareServer::Activation::Activations::Failed);
166 }
167
168 return;
169}
170
171
Saqib Khanb0774702017-05-23 16:02:41 -0500172} // namespace updater
173} // namespace software
174} // namespace phosphor