Skip to content

Commit

Permalink
Project broadcast application instance moved (#1570)
Browse files Browse the repository at this point in the history
* Project and brodcast ApplicationInstanceMoved

* Fix sapsystem saga

* Review fixes
  • Loading branch information
fabriziosestito committed Jul 3, 2023
1 parent 58bd72a commit 82e182c
Show file tree
Hide file tree
Showing 5 changed files with 203 additions and 78 deletions.
21 changes: 16 additions & 5 deletions assets/js/state/sagas/sapSystems.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ function* sapSystemRegistered({ payload }) {
}

function* sapSystemHealthChanged({ payload }) {
const sid = (yield select(getSapSystem(payload.id)))?.sid || 'unable to determine SID';
const sid =
(yield select(getSapSystem(payload.id)))?.sid || 'unable to determine SID';

yield put(updateSapSystemHealth(payload));
yield put(
Expand All @@ -65,7 +66,8 @@ function* applicationInstanceRegistered({ payload }) {
);
}

export function* applicationInstanceMoved({ payload: { sid, instance_number } }) {
export function* applicationInstanceMoved({ payload }) {
const { sid, instance_number } = payload;
yield put(updateApplicationInstanceHost(payload));
yield put(
notify({
Expand Down Expand Up @@ -112,10 +114,19 @@ export function* sapSystemUpdated({ payload }) {
export function* watchSapSystem() {
yield takeEvery(SAP_SYSTEM_REGISTERED, sapSystemRegistered);
yield takeEvery(SAP_SYSTEM_HEALTH_CHANGED, sapSystemHealthChanged);
yield takeEvery(APPLICATION_INSTANCE_REGISTERED, applicationInstanceRegistered);
yield takeEvery(
APPLICATION_INSTANCE_REGISTERED,
applicationInstanceRegistered
);
yield takeEvery(APPLICATION_INSTANCE_MOVED, applicationInstanceMoved);
yield takeEvery(APPLICATION_INSTANCE_DEREGISTERED, applicationInstanceDeregistered);
yield takeEvery(APPLICATION_INSTANCE_HEALTH_CHANGED, applicationInstanceHealthChanged);
yield takeEvery(
APPLICATION_INSTANCE_DEREGISTERED,
applicationInstanceDeregistered
);
yield takeEvery(
APPLICATION_INSTANCE_HEALTH_CHANGED,
applicationInstanceHealthChanged
);
yield takeEvery(SAP_SYSTEM_DEREGISTERED, sapSystemDeregistered);
yield takeEvery(SAP_SYSTEM_UPDATED, sapSystemUpdated);
}
49 changes: 32 additions & 17 deletions assets/js/state/sapSystems.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@ export const sapSystemsListSlice = createSlice({
setSapSystems: (state, { payload }) => {
state.sapSystems = payload;

state.applicationInstances = payload.flatMap((sapSystem) => sapSystem.application_instances);
state.databaseInstances = payload.flatMap((sapSystem) => sapSystem.database_instances);
state.applicationInstances = payload.flatMap(
(sapSystem) => sapSystem.application_instances
);
state.databaseInstances = payload.flatMap(
(sapSystem) => sapSystem.database_instances
);
},
startSapSystemsLoading: (state) => {
state.loading = true;
Expand All @@ -36,7 +40,10 @@ export const sapSystemsListSlice = createSlice({
// When a new ApplicationInstanceRegistered comes in,
// it need to be appended to the list of the application instances of the relative sap system
appendApplicationInstance: (state, action) => {
state.applicationInstances = [...state.applicationInstances, action.payload];
state.applicationInstances = [
...state.applicationInstances,
action.payload,
];
},
removeApplicationInstance: (
state,
Expand Down Expand Up @@ -81,16 +88,18 @@ export const sapSystemsListSlice = createSlice({
state,
{ payload: { sap_system_id, old_host_id, new_host_id, instance_number } }
) => {
state.applicationInstances = state.applicationInstances.map((instance) => {
if (
instance.sap_system_id === sap_system_id &&
instance.host_id === old_host_id &&
instance.instance_number === instance_number
) {
instance.host_id = new_host_id;
state.applicationInstances = state.applicationInstances.map(
(instance) => {
if (
instance.sap_system_id === sap_system_id &&
instance.host_id === old_host_id &&
instance.instance_number === instance_number
) {
instance.host_id = new_host_id;
}
return instance;
}
return instance;
});
);
},
updateApplicationInstanceHealth: (state, action) => {
state.applicationInstances = state.applicationInstances.map((instance) =>
Expand All @@ -110,7 +119,8 @@ export const sapSystemsListSlice = createSlice({
action.payload.instance_number === instance.instance_number
) {
instance.system_replication = action.payload.system_replication;
instance.system_replication_status = action.payload.system_replication_status;
instance.system_replication_status =
action.payload.system_replication_status;
}
return instance;
});
Expand All @@ -134,7 +144,9 @@ export const sapSystemsListSlice = createSlice({
});
},
removeSAPSystem: (state, { payload: { id } }) => {
state.sapSystems = state.sapSystems.filter((sapSystem) => sapSystem.id !== id);
state.sapSystems = state.sapSystems.filter(
(sapSystem) => sapSystem.id !== id
);
},
updateSAPSystem: (state, { payload }) => {
state.sapSystems = state.sapSystems.map((sapSystem) => {
Expand All @@ -149,10 +161,13 @@ export const sapSystemsListSlice = createSlice({

export const SAP_SYSTEM_REGISTERED = 'SAP_SYSTEM_REGISTERED';
export const SAP_SYSTEM_HEALTH_CHANGED = 'SAP_SYSTEM_HEALTH_CHANGED';
export const APPLICATION_INSTANCE_REGISTERED = 'APPLICATION_INSTANCE_REGISTERED';
export const APPLICATION_INSTANCE_REGISTERED =
'APPLICATION_INSTANCE_REGISTERED';
export const APPLICATION_INSTANCE_MOVED = 'APPLICATION_INSTANCE_MOVED';
export const APPLICATION_INSTANCE_DEREGISTERED = 'APPLICATION_INSTANCE_DEREGISTERED';
export const APPLICATION_INSTANCE_HEALTH_CHANGED = 'APPLICATION_INSTANCE_HEALTH_CHANGED';
export const APPLICATION_INSTANCE_DEREGISTERED =
'APPLICATION_INSTANCE_DEREGISTERED';
export const APPLICATION_INSTANCE_HEALTH_CHANGED =
'APPLICATION_INSTANCE_HEALTH_CHANGED';
export const SAP_SYSTEM_DEREGISTERED = 'SAP_SYSTEM_DEREGISTERED';
export const SAP_SYSTEM_UPDATED = 'SAP_SYSTEM_UPDATED';

Expand Down
46 changes: 46 additions & 0 deletions lib/trento/application/projectors/sap_system_projector.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ defmodule Trento.SapSystemProjector do
alias Trento.Domain.Events.{
ApplicationInstanceDeregistered,
ApplicationInstanceHealthChanged,
ApplicationInstanceMoved,
ApplicationInstanceRegistered,
SapSystemDeregistered,
SapSystemHealthChanged,
Expand Down Expand Up @@ -97,6 +98,26 @@ defmodule Trento.SapSystemProjector do
end
)

project(
%ApplicationInstanceMoved{
sap_system_id: sap_system_id,
instance_number: instance_number,
old_host_id: old_host_id,
new_host_id: new_host_id
},
fn multi ->
instance =
Repo.get_by(ApplicationInstanceReadModel,
sap_system_id: sap_system_id,
instance_number: instance_number,
host_id: old_host_id
)

changeset = ApplicationInstanceReadModel.changeset(instance, %{host_id: new_host_id})
Ecto.Multi.update(multi, :application_instance, changeset)
end
)

project(
%ApplicationInstanceHealthChanged{
sap_system_id: sap_system_id,
Expand Down Expand Up @@ -237,6 +258,31 @@ defmodule Trento.SapSystemProjector do
)
end

@impl true
def after_update(
%ApplicationInstanceMoved{
sap_system_id: sap_system_id,
instance_number: instance_number,
old_host_id: old_host_id,
new_host_id: new_host_id
},
_,
_
) do
TrentoWeb.Endpoint.broadcast(
@sap_systems_topic,
"application_instance_moved",
SapSystemView.render("application_instance_moved.json",
instance_moved: %{
sap_system_id: sap_system_id,
instance_number: instance_number,
old_host_id: old_host_id,
new_host_id: new_host_id
}
)
)
end

@impl true
def after_update(
%ApplicationInstanceHealthChanged{},
Expand Down
3 changes: 3 additions & 0 deletions lib/trento_web/views/v1/sap_system_view.ex
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ defmodule TrentoWeb.V1.SapSystemView do
|> Map.delete(:host)
end

def render("application_instance_moved.json", %{instance_moved: instance_moved}),
do: instance_moved

def render("application_instance_health_changed.json", %{health: health}), do: health

def render("sap_systems.json", %{sap_systems: sap_systems}) do
Expand Down

0 comments on commit 82e182c

Please sign in to comment.