From e6aa120516781c82953f7c94265b075f6d5f324a Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 22 Aug 2023 09:00:41 +0200 Subject: [PATCH 01/14] Mark hosts as absent on backend --- .../discovery/policies/cluster_policy.ex | 9 +- .../discovery/policies/sap_system_policy.ex | 12 +-- .../projectors/cluster_projector.ex | 29 +++++ .../projectors/database_projector.ex | 50 +++++++++ .../projectors/sap_system_projector.ex | 50 +++++++++ .../read_models/cluster_read_model.ex | 1 + .../read_models/host_read_model.ex | 1 + lib/trento/domain/cluster/cluster.ex | 28 ++++- .../commands/mark_cluster_host_absent.ex | 14 +++ .../events/cluster_host_marked_absent.ex | 14 +++ .../mark_application_instance_absent.ex | 15 +++ .../commands/mark_database_instance_absent.ex | 15 +++ .../application_instance_marked_absent.ex | 14 +++ .../events/database_instance_marked_absent.ex | 14 +++ lib/trento/domain/sap_system/instance.ex | 1 + lib/trento/domain/sap_system/sap_system.ex | 102 ++++++++++++++++++ lib/trento_web/views/v1/sap_system_view.ex | 15 +++ .../policies/cluster_policy_test.exs | 8 +- .../policies/sap_system_policy_test.exs | 14 +-- 19 files changed, 383 insertions(+), 23 deletions(-) create mode 100644 lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex create mode 100644 lib/trento/domain/cluster/events/cluster_host_marked_absent.ex create mode 100644 lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex create mode 100644 lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex create mode 100644 lib/trento/domain/sap_system/events/application_instance_marked_absent.ex create mode 100644 lib/trento/domain/sap_system/events/database_instance_marked_absent.ex diff --git a/lib/trento/application/integration/discovery/policies/cluster_policy.ex b/lib/trento/application/integration/discovery/policies/cluster_policy.ex index a71bb9327c..58c71c7374 100644 --- a/lib/trento/application/integration/discovery/policies/cluster_policy.ex +++ b/lib/trento/application/integration/discovery/policies/cluster_policy.ex @@ -8,10 +8,7 @@ defmodule Trento.Integration.Discovery.ClusterPolicy do require Trento.Domain.Enums.Health, as: Health require Trento.Domain.Enums.AscsErsClusterRole, as: AscsErsClusterRole - alias Trento.Domain.Commands.{ - DeregisterClusterHost, - RegisterClusterHost - } + alias Trento.Domain.Commands.{MarkClusterHostAbsent, RegisterClusterHost} alias Trento.Integration.Discovery.ClusterDiscoveryPayload @@ -64,10 +61,10 @@ defmodule Trento.Integration.Discovery.ClusterPolicy do defp build_deregister_cluster_host_command(agent_id, cluster_id, current_cluster_id) do if generate_cluster_id(cluster_id) != current_cluster_id do - DeregisterClusterHost.new!(%{ + MarkClusterHostAbsent.new!(%{ host_id: agent_id, cluster_id: current_cluster_id, - deregistered_at: DateTime.utc_now() + absent: DateTime.utc_now() }) end end diff --git a/lib/trento/application/integration/discovery/policies/sap_system_policy.ex b/lib/trento/application/integration/discovery/policies/sap_system_policy.ex index da5a57e3d2..b9222028bc 100644 --- a/lib/trento/application/integration/discovery/policies/sap_system_policy.ex +++ b/lib/trento/application/integration/discovery/policies/sap_system_policy.ex @@ -8,6 +8,8 @@ defmodule Trento.Integration.Discovery.SapSystemPolicy do alias Trento.Domain.Commands.{ DeregisterApplicationInstance, DeregisterDatabaseInstance, + MarkApplicationInstanceAbsent, + MarkDatabaseInstanceAbsent, RegisterApplicationInstance, RegisterDatabaseInstance } @@ -146,21 +148,19 @@ defmodule Trento.Integration.Discovery.SapSystemPolicy do defp build_deregister_instances_commands(current_instances) do Enum.map(current_instances, fn %ApplicationInstanceReadModel{} = instance -> - DeregisterApplicationInstance.new!(%{ - sid: instance.sid, + MarkApplicationInstanceAbsent.new!(%{ host_id: instance.host_id, instance_number: instance.instance_number, sap_system_id: instance.sap_system_id, - deregistered_at: DateTime.utc_now() + absent: DateTime.utc_now() }) %DatabaseInstanceReadModel{} = instance -> - DeregisterDatabaseInstance.new!(%{ - sid: instance.sid, + MarkDatabaseInstanceAbsent.new!(%{ host_id: instance.host_id, instance_number: instance.instance_number, sap_system_id: instance.sap_system_id, - deregistered_at: DateTime.utc_now() + absent: DateTime.utc_now() }) end) end diff --git a/lib/trento/application/projectors/cluster_projector.ex b/lib/trento/application/projectors/cluster_projector.ex index 53fd07afbe..c25f019b52 100644 --- a/lib/trento/application/projectors/cluster_projector.ex +++ b/lib/trento/application/projectors/cluster_projector.ex @@ -15,6 +15,7 @@ defmodule Trento.ClusterProjector do ClusterDeregistered, ClusterDetailsUpdated, ClusterHealthChanged, + ClusterHostMarkedAbsent, ClusterRegistered, ClusterRestored } @@ -57,6 +58,23 @@ defmodule Trento.ClusterProjector do end ) + project( + %ClusterHostMarkedAbsent{ + cluster_id: cluster_id, + absent: absent + }, + fn multi -> + changeset = + ClusterReadModel + |> Repo.get!(cluster_id) + |> ClusterReadModel.changeset(%{ + absent: absent + }) + + Ecto.Multi.update(multi, :cluster, changeset) + end + ) + project( %ClusterDeregistered{ cluster_id: cluster_id, @@ -83,6 +101,7 @@ defmodule Trento.ClusterProjector do ClusterReadModel |> Repo.get!(cluster_id) |> ClusterReadModel.changeset(%{ + absent: nil, deregistered_at: nil }) @@ -191,6 +210,16 @@ defmodule Trento.ClusterProjector do }) end + @impl true + def after_update(%ClusterHostMarkedAbsent{cluster_id: cluster_id}, _, %{ + cluster: %ClusterReadModel{name: name} + }) do + TrentoWeb.Endpoint.broadcast("monitoring:clusters", "cluster_absent", %{ + id: cluster_id, + name: name + }) + end + @impl true def after_update(%ClusterDeregistered{cluster_id: cluster_id}, _, %{ cluster: %ClusterReadModel{name: name} diff --git a/lib/trento/application/projectors/database_projector.ex b/lib/trento/application/projectors/database_projector.ex index 09b7a21095..7a66dc9b8e 100644 --- a/lib/trento/application/projectors/database_projector.ex +++ b/lib/trento/application/projectors/database_projector.ex @@ -19,6 +19,7 @@ defmodule Trento.DatabaseProjector do DatabaseDeregistered, DatabaseHealthChanged, DatabaseInstanceDeregistered, + DatabaseInstanceMarkedAbsent, DatabaseInstanceHealthChanged, DatabaseInstanceRegistered, DatabaseInstanceSystemReplicationChanged, @@ -173,6 +174,29 @@ defmodule Trento.DatabaseProjector do end ) + project( + %DatabaseInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent: absent + }, + fn multi -> + changeset = + DatabaseInstanceReadModel + |> Repo.get_by( + sap_system_id: sap_system_id, + instance_number: instance_number, + host_id: host_id + ) + |> DatabaseInstanceReadModel.changeset(%{ + absent: absent + }) + + Ecto.Multi.update(multi, :database_instance, changeset) + end + ) + project( %DatabaseInstanceDeregistered{ instance_number: instance_number, @@ -321,6 +345,32 @@ defmodule Trento.DatabaseProjector do ) end + @impl true + def after_update( + %DatabaseInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent: absent + }, + _, + %{ + database_instance: %DatabaseInstanceReadModel{sid: sid} + } + ) do + TrentoWeb.Endpoint.broadcast( + @databases_topic, + "database_instance_marked_absent", + SapSystemView.render("instance_marked_absent.json", + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + sid: sid, + absent: absent + ) + ) + end + @impl true def after_update( %DatabaseDeregistered{ diff --git a/lib/trento/application/projectors/sap_system_projector.ex b/lib/trento/application/projectors/sap_system_projector.ex index d8c59392ff..69cc8343e0 100644 --- a/lib/trento/application/projectors/sap_system_projector.ex +++ b/lib/trento/application/projectors/sap_system_projector.ex @@ -11,6 +11,7 @@ defmodule Trento.SapSystemProjector do alias Trento.Domain.Events.{ ApplicationInstanceDeregistered, ApplicationInstanceHealthChanged, + ApplicationInstanceMarkedAbsent, ApplicationInstanceMoved, ApplicationInstanceRegistered, SapSystemDeregistered, @@ -179,6 +180,29 @@ defmodule Trento.SapSystemProjector do end ) + project( + %ApplicationInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent: absent + }, + fn multi -> + changeset = + ApplicationInstanceReadModel + |> Repo.get_by( + sap_system_id: sap_system_id, + instance_number: instance_number, + host_id: host_id + ) + |> ApplicationInstanceReadModel.changeset(%{ + absent: absent + }) + + Ecto.Multi.update(multi, :application_instance, changeset) + end + ) + project( %ApplicationInstanceDeregistered{ instance_number: instance_number, @@ -348,6 +372,32 @@ defmodule Trento.SapSystemProjector do ) end + @impl true + def after_update( + %ApplicationInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent: absent + }, + _, + %{ + application_instance: %ApplicationInstanceReadModel{sid: sid} + } + ) do + TrentoWeb.Endpoint.broadcast( + @sap_systems_topic, + "application_instance_marked_absent", + SapSystemView.render("instance_marked_absent.json", + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + sid: sid, + absent: absent + ) + ) + end + @impl true def after_update( %ApplicationInstanceDeregistered{ diff --git a/lib/trento/application/read_models/cluster_read_model.ex b/lib/trento/application/read_models/cluster_read_model.ex index 06e36d0ee2..59f7fc18c2 100644 --- a/lib/trento/application/read_models/cluster_read_model.ex +++ b/lib/trento/application/read_models/cluster_read_model.ex @@ -33,6 +33,7 @@ defmodule Trento.ClusterReadModel do field :cib_last_written, :string, virtual: true field :deregistered_at, :utc_datetime_usec + field :absent, :utc_datetime_usec end @spec changeset(t() | Ecto.Changeset.t(), map) :: Ecto.Changeset.t() diff --git a/lib/trento/application/read_models/host_read_model.ex b/lib/trento/application/read_models/host_read_model.ex index f596daaa89..76f849e1da 100644 --- a/lib/trento/application/read_models/host_read_model.ex +++ b/lib/trento/application/read_models/host_read_model.ex @@ -35,6 +35,7 @@ defmodule Trento.HostReadModel do field :last_heartbeat_timestamp, :utc_datetime_usec, virtual: true field :deregistered_at, :utc_datetime_usec + field :absent, :utc_datetime_usec end @spec changeset(t() | Ecto.Changeset.t(), map) :: Ecto.Changeset.t() diff --git a/lib/trento/domain/cluster/cluster.ex b/lib/trento/domain/cluster/cluster.ex index 64f46c3f00..1261a0c4bb 100644 --- a/lib/trento/domain/cluster/cluster.ex +++ b/lib/trento/domain/cluster/cluster.ex @@ -70,6 +70,7 @@ defmodule Trento.Domain.Cluster do alias Trento.Domain.Commands.{ CompleteChecksExecution, DeregisterClusterHost, + MarkClusterHostAbsent, RegisterClusterHost, RollUpCluster, SelectChecks @@ -85,6 +86,7 @@ defmodule Trento.Domain.Cluster do ClusterDetailsUpdated, ClusterDiscoveredHealthChanged, ClusterHealthChanged, + ClusterHostMarkedAbsent, ClusterRegistered, ClusterRestored, ClusterRolledUp, @@ -121,6 +123,7 @@ defmodule Trento.Domain.Cluster do field :selected_checks, {:array, :string}, default: [] field :rolling_up, :boolean, default: false field :deregistered_at, :utc_datetime_usec, default: nil + field :absent, :utc_datetime_usec, default: nil field :details, PolymorphicEmbed, types: [ @@ -321,6 +324,25 @@ defmodule Trento.Domain.Cluster do |> Multi.execute(&maybe_emit_cluster_health_changed_event/1) end + def execute( + %Cluster{cluster_id: cluster_id} = cluster, + %MarkClusterHostAbsent{ + host_id: host_id, + cluster_id: cluster_id, + absent: absent + } + ) do + cluster + |> Multi.new() + |> Multi.execute(fn _ -> + %ClusterHostMarkedAbsent{ + host_id: host_id, + cluster_id: cluster_id, + absent: absent + } + end) + end + def execute( %Cluster{cluster_id: cluster_id} = cluster, %DeregisterClusterHost{ @@ -458,6 +480,10 @@ defmodule Trento.Domain.Cluster do %Cluster{cluster | hosts: List.delete(hosts, host_id)} end + def apply(%Cluster{} = cluster, %ClusterHostMarkedAbsent{absent: absent}) do + %Cluster{cluster | absent: absent} + end + # Deregistration def apply(%Cluster{} = cluster, %ClusterDeregistered{deregistered_at: deregistered_at}) do %Cluster{cluster | deregistered_at: deregistered_at} @@ -465,7 +491,7 @@ defmodule Trento.Domain.Cluster do # Restoration def apply(%Cluster{} = cluster, %ClusterRestored{}) do - %Cluster{cluster | deregistered_at: nil} + %Cluster{cluster | absent: nil, deregistered_at: nil} end def apply(cluster, %legacy_event{}) when legacy_event in @legacy_events, do: cluster diff --git a/lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex b/lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex new file mode 100644 index 0000000000..d71a9c7b3e --- /dev/null +++ b/lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex @@ -0,0 +1,14 @@ +defmodule Trento.Domain.Commands.MarkClusterHostAbsent do + @moduledoc """ + Mark a host in a cluster as absent + """ + @required_fields :all + + use Trento.Command + + defcommand do + field :host_id, Ecto.UUID + field :cluster_id, Ecto.UUID + field :absent, :utc_datetime_usec + end +end diff --git a/lib/trento/domain/cluster/events/cluster_host_marked_absent.ex b/lib/trento/domain/cluster/events/cluster_host_marked_absent.ex new file mode 100644 index 0000000000..f4461fc485 --- /dev/null +++ b/lib/trento/domain/cluster/events/cluster_host_marked_absent.ex @@ -0,0 +1,14 @@ +defmodule Trento.Domain.Events.ClusterHostMarkedAbsent do + @moduledoc """ + This event is emitted when a cluster host is marked as absent + """ + @required_fields :all + + use Trento.Event + + defevent do + field :host_id, Ecto.UUID + field :cluster_id, Ecto.UUID + field :absent, :utc_datetime_usec + end +end diff --git a/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex b/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex new file mode 100644 index 0000000000..ec6e3766ac --- /dev/null +++ b/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex @@ -0,0 +1,15 @@ +defmodule Trento.Domain.Commands.MarkApplicationInstanceAbsent do + @moduledoc """ + Mark an application instance as absent from the monitoring system. + """ + @required_fields :all + + use Trento.Command + + defcommand do + field :instance_number, :string + field :host_id, Ecto.UUID + field :sap_system_id, Ecto.UUID + field :absent, :utc_datetime_usec + end +end diff --git a/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex b/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex new file mode 100644 index 0000000000..51fc51d437 --- /dev/null +++ b/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex @@ -0,0 +1,15 @@ +defmodule Trento.Domain.Commands.MarkDatabaseInstanceAbsent do + @moduledoc """ + Mark a database instance as absent from the monitoring system. + """ + @required_fields :all + + use Trento.Command + + defcommand do + field :instance_number, :string + field :host_id, Ecto.UUID + field :sap_system_id, Ecto.UUID + field :absent, :utc_datetime_usec + end +end diff --git a/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex b/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex new file mode 100644 index 0000000000..017a710081 --- /dev/null +++ b/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex @@ -0,0 +1,14 @@ +defmodule Trento.Domain.Events.ApplicationInstanceMarkedAbsent do + @moduledoc """ + This event is emitted when an application instance is marked as absent from the SAP system. + """ + + use Trento.Event + + defevent do + field :instance_number, :string + field :host_id, Ecto.UUID + field :sap_system_id, Ecto.UUID + field :absent, :utc_datetime_usec + end +end diff --git a/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex b/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex new file mode 100644 index 0000000000..0d81a686b3 --- /dev/null +++ b/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex @@ -0,0 +1,14 @@ +defmodule Trento.Domain.Events.DatabaseInstanceMarkedAbsent do + @moduledoc """ + This event is emitted when a database instance is marked as absent from the SAP system. + """ + + use Trento.Event + + defevent do + field :instance_number, :string + field :host_id, Ecto.UUID + field :sap_system_id, Ecto.UUID + field :absent, :utc_datetime_usec + end +end diff --git a/lib/trento/domain/sap_system/instance.ex b/lib/trento/domain/sap_system/instance.ex index 262dd00904..dd72699f54 100644 --- a/lib/trento/domain/sap_system/instance.ex +++ b/lib/trento/domain/sap_system/instance.ex @@ -17,5 +17,6 @@ defmodule Trento.Domain.SapSystem.Instance do field :health, Ecto.Enum, values: Health.values() field :system_replication, :string field :system_replication_status, :string + field :absent, :utc_datetime_usec end end diff --git a/lib/trento/domain/sap_system/sap_system.ex b/lib/trento/domain/sap_system/sap_system.ex index aad55c3e1b..830bac3c14 100644 --- a/lib/trento/domain/sap_system/sap_system.ex +++ b/lib/trento/domain/sap_system/sap_system.ex @@ -60,6 +60,8 @@ defmodule Trento.Domain.SapSystem do alias Trento.Domain.Commands.{ DeregisterApplicationInstance, DeregisterDatabaseInstance, + MarkApplicationInstanceAbsent, + MarkDatabaseInstanceAbsent, RegisterApplicationInstance, RegisterDatabaseInstance, RollUpSapSystem @@ -68,12 +70,14 @@ defmodule Trento.Domain.SapSystem do alias Trento.Domain.Events.{ ApplicationInstanceDeregistered, ApplicationInstanceHealthChanged, + ApplicationInstanceMarkedAbsent, ApplicationInstanceMoved, ApplicationInstanceRegistered, DatabaseDeregistered, DatabaseHealthChanged, DatabaseInstanceDeregistered, DatabaseInstanceHealthChanged, + DatabaseInstanceMarkedAbsent, DatabaseInstanceRegistered, DatabaseInstanceSystemReplicationChanged, DatabaseRegistered, @@ -300,6 +304,46 @@ defmodule Trento.Domain.SapSystem do {:error, :sap_system_not_registered} end + def execute( + %SapSystem{sap_system_id: sap_system_id} = sap_system, + %MarkDatabaseInstanceAbsent{ + instance_number: instance_number, + host_id: host_id, + absent: absent + } + ) do + sap_system + |> Multi.new() + |> Multi.execute(fn _ -> + %DatabaseInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent: absent + } + end) + end + + def execute( + %SapSystem{sap_system_id: sap_system_id} = sap_system, + %MarkApplicationInstanceAbsent{ + instance_number: instance_number, + host_id: host_id, + absent: absent + } + ) do + sap_system + |> Multi.new() + |> Multi.execute(fn _ -> + %ApplicationInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent: absent + } + end) + end + # Deregister a database instance and emit a DatabaseInstanceDeregistered # also potentially emit SapSystemDeregistered and DatabaseDeregistered events def execute( @@ -620,6 +664,64 @@ defmodule Trento.Domain.SapSystem do snapshot end + def apply( + %SapSystem{database: %Database{instances: instances} = database} = sap_system, + %DatabaseInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + absent: absent + } + ) do + instances = + Enum.map( + instances, + fn instance -> + if instance.instance_number == instance_number and instance.host_id == host_id do + %Instance{instance | absent: absent} + else + instance + end + end + ) + + %SapSystem{ + sap_system + | database: %Database{ + database + | instances: instances + } + } + end + + def apply( + %SapSystem{application: %Application{instances: instances} = application} = sap_system, + %ApplicationInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + absent: absent + } + ) do + instances = + Enum.map( + instances, + fn instance -> + if instance.instance_number == instance_number and instance.host_id == host_id do + %Instance{instance | absent: absent} + else + instance + end + end + ) + + %SapSystem{ + sap_system + | application: %Application{ + application + | instances: instances + } + } + end + def apply( %SapSystem{database: %Database{instances: instances} = database} = sap_system, %DatabaseInstanceDeregistered{ diff --git a/lib/trento_web/views/v1/sap_system_view.ex b/lib/trento_web/views/v1/sap_system_view.ex index 6d1f20230f..d03e954d35 100644 --- a/lib/trento_web/views/v1/sap_system_view.ex +++ b/lib/trento_web/views/v1/sap_system_view.ex @@ -150,6 +150,21 @@ defmodule TrentoWeb.V1.SapSystemView do def render("database_deregistered.json", %{id: id, sid: sid}), do: %{id: id, sid: sid} + def render("instance_marked_absent.json", %{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + sid: sid, + absent: absent + }), + do: %{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + sid: sid, + absent: absent + } + def render("instance_deregistered.json", %{ sap_system_id: id, instance_number: instance_number, diff --git a/test/trento/application/integration/discovery/policies/cluster_policy_test.exs b/test/trento/application/integration/discovery/policies/cluster_policy_test.exs index 7c2c3f5dd7..d614e06acf 100644 --- a/test/trento/application/integration/discovery/policies/cluster_policy_test.exs +++ b/test/trento/application/integration/discovery/policies/cluster_policy_test.exs @@ -10,7 +10,7 @@ defmodule Trento.Integration.Discovery.ClusterPolicyTest do alias Trento.Integration.Discovery.ClusterPolicy - alias Trento.Domain.Commands.{DeregisterClusterHost, RegisterClusterHost} + alias Trento.Domain.Commands.{DeregisterClusterHost, MarkClusterHostAbsent, RegisterClusterHost} alias Trento.Domain.{ AscsErsClusterDetails, @@ -1296,7 +1296,7 @@ defmodule Trento.Integration.Discovery.ClusterPolicyTest do {:ok, [ - %DeregisterClusterHost{cluster_id: ^current_cluster_id}, + %MarkClusterHostAbsent{cluster_id: ^current_cluster_id}, %RegisterClusterHost{cluster_id: "34a94290-2236-5e4d-8def-05beb32d14d4"} ]} = "ha_cluster_discovery_hana_scale_up" @@ -1304,12 +1304,12 @@ defmodule Trento.Integration.Discovery.ClusterPolicyTest do |> ClusterPolicy.handle(current_cluster_id) end - test "should deregister the host from the current cluster" do + test "should mark the host as absent from the current cluster" do current_cluster_id = UUID.uuid4() {:ok, [ - %DeregisterClusterHost{cluster_id: ^current_cluster_id} + %MarkClusterHostAbsent{cluster_id: ^current_cluster_id} ]} = "ha_cluster_discovery_unclustered" |> load_discovery_event_fixture() diff --git a/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs b/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs index e6320fc9a7..3007dc45ab 100644 --- a/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs +++ b/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs @@ -13,6 +13,8 @@ defmodule Trento.Integration.Discovery.SapSystemPolicyTest do alias Trento.Domain.Commands.{ DeregisterApplicationInstance, DeregisterDatabaseInstance, + MarkApplicationInstanceAbsent, + MarkDatabaseInstanceAbsent, RegisterApplicationInstance, RegisterDatabaseInstance } @@ -174,18 +176,18 @@ defmodule Trento.Integration.Discovery.SapSystemPolicyTest do assert {:ok, [ - %DeregisterDatabaseInstance{ + %MarkDatabaseInstanceAbsent{ sap_system_id: ^database_sap_system_id, instance_number: ^database_instance_number_1 }, - %DeregisterDatabaseInstance{ + %MarkDatabaseInstanceAbsent{ sap_system_id: ^database_sap_system_id, instance_number: ^database_instance_number_2 }, - %DeregisterApplicationInstance{ + %MarkApplicationInstanceAbsent{ instance_number: ^application_instance_number_1 }, - %DeregisterApplicationInstance{ + %MarkApplicationInstanceAbsent{ instance_number: ^application_instance_number_2 }, %RegisterDatabaseInstance{ @@ -239,10 +241,10 @@ defmodule Trento.Integration.Discovery.SapSystemPolicyTest do assert {:ok, [ - %DeregisterApplicationInstance{ + %MarkApplicationInstanceAbsent{ instance_number: "02" }, - %DeregisterDatabaseInstance{ + %MarkDatabaseInstanceAbsent{ instance_number: "10" } ]} = From c345e99ad7173679e3bae1bd8b8a994ff4bc28ab Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 22 Aug 2023 15:48:40 +0200 Subject: [PATCH 02/14] Revert changes to cluster --- .../discovery/policies/cluster_policy.ex | 9 ++++-- .../projectors/cluster_projector.ex | 29 ------------------- .../read_models/cluster_read_model.ex | 1 - lib/trento/domain/cluster/cluster.ex | 28 +----------------- .../commands/mark_cluster_host_absent.ex | 14 --------- .../events/cluster_host_marked_absent.ex | 14 --------- .../policies/cluster_policy_test.exs | 8 ++--- 7 files changed, 11 insertions(+), 92 deletions(-) delete mode 100644 lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex delete mode 100644 lib/trento/domain/cluster/events/cluster_host_marked_absent.ex diff --git a/lib/trento/application/integration/discovery/policies/cluster_policy.ex b/lib/trento/application/integration/discovery/policies/cluster_policy.ex index 58c71c7374..a71bb9327c 100644 --- a/lib/trento/application/integration/discovery/policies/cluster_policy.ex +++ b/lib/trento/application/integration/discovery/policies/cluster_policy.ex @@ -8,7 +8,10 @@ defmodule Trento.Integration.Discovery.ClusterPolicy do require Trento.Domain.Enums.Health, as: Health require Trento.Domain.Enums.AscsErsClusterRole, as: AscsErsClusterRole - alias Trento.Domain.Commands.{MarkClusterHostAbsent, RegisterClusterHost} + alias Trento.Domain.Commands.{ + DeregisterClusterHost, + RegisterClusterHost + } alias Trento.Integration.Discovery.ClusterDiscoveryPayload @@ -61,10 +64,10 @@ defmodule Trento.Integration.Discovery.ClusterPolicy do defp build_deregister_cluster_host_command(agent_id, cluster_id, current_cluster_id) do if generate_cluster_id(cluster_id) != current_cluster_id do - MarkClusterHostAbsent.new!(%{ + DeregisterClusterHost.new!(%{ host_id: agent_id, cluster_id: current_cluster_id, - absent: DateTime.utc_now() + deregistered_at: DateTime.utc_now() }) end end diff --git a/lib/trento/application/projectors/cluster_projector.ex b/lib/trento/application/projectors/cluster_projector.ex index c25f019b52..53fd07afbe 100644 --- a/lib/trento/application/projectors/cluster_projector.ex +++ b/lib/trento/application/projectors/cluster_projector.ex @@ -15,7 +15,6 @@ defmodule Trento.ClusterProjector do ClusterDeregistered, ClusterDetailsUpdated, ClusterHealthChanged, - ClusterHostMarkedAbsent, ClusterRegistered, ClusterRestored } @@ -58,23 +57,6 @@ defmodule Trento.ClusterProjector do end ) - project( - %ClusterHostMarkedAbsent{ - cluster_id: cluster_id, - absent: absent - }, - fn multi -> - changeset = - ClusterReadModel - |> Repo.get!(cluster_id) - |> ClusterReadModel.changeset(%{ - absent: absent - }) - - Ecto.Multi.update(multi, :cluster, changeset) - end - ) - project( %ClusterDeregistered{ cluster_id: cluster_id, @@ -101,7 +83,6 @@ defmodule Trento.ClusterProjector do ClusterReadModel |> Repo.get!(cluster_id) |> ClusterReadModel.changeset(%{ - absent: nil, deregistered_at: nil }) @@ -210,16 +191,6 @@ defmodule Trento.ClusterProjector do }) end - @impl true - def after_update(%ClusterHostMarkedAbsent{cluster_id: cluster_id}, _, %{ - cluster: %ClusterReadModel{name: name} - }) do - TrentoWeb.Endpoint.broadcast("monitoring:clusters", "cluster_absent", %{ - id: cluster_id, - name: name - }) - end - @impl true def after_update(%ClusterDeregistered{cluster_id: cluster_id}, _, %{ cluster: %ClusterReadModel{name: name} diff --git a/lib/trento/application/read_models/cluster_read_model.ex b/lib/trento/application/read_models/cluster_read_model.ex index 59f7fc18c2..06e36d0ee2 100644 --- a/lib/trento/application/read_models/cluster_read_model.ex +++ b/lib/trento/application/read_models/cluster_read_model.ex @@ -33,7 +33,6 @@ defmodule Trento.ClusterReadModel do field :cib_last_written, :string, virtual: true field :deregistered_at, :utc_datetime_usec - field :absent, :utc_datetime_usec end @spec changeset(t() | Ecto.Changeset.t(), map) :: Ecto.Changeset.t() diff --git a/lib/trento/domain/cluster/cluster.ex b/lib/trento/domain/cluster/cluster.ex index 1261a0c4bb..64f46c3f00 100644 --- a/lib/trento/domain/cluster/cluster.ex +++ b/lib/trento/domain/cluster/cluster.ex @@ -70,7 +70,6 @@ defmodule Trento.Domain.Cluster do alias Trento.Domain.Commands.{ CompleteChecksExecution, DeregisterClusterHost, - MarkClusterHostAbsent, RegisterClusterHost, RollUpCluster, SelectChecks @@ -86,7 +85,6 @@ defmodule Trento.Domain.Cluster do ClusterDetailsUpdated, ClusterDiscoveredHealthChanged, ClusterHealthChanged, - ClusterHostMarkedAbsent, ClusterRegistered, ClusterRestored, ClusterRolledUp, @@ -123,7 +121,6 @@ defmodule Trento.Domain.Cluster do field :selected_checks, {:array, :string}, default: [] field :rolling_up, :boolean, default: false field :deregistered_at, :utc_datetime_usec, default: nil - field :absent, :utc_datetime_usec, default: nil field :details, PolymorphicEmbed, types: [ @@ -324,25 +321,6 @@ defmodule Trento.Domain.Cluster do |> Multi.execute(&maybe_emit_cluster_health_changed_event/1) end - def execute( - %Cluster{cluster_id: cluster_id} = cluster, - %MarkClusterHostAbsent{ - host_id: host_id, - cluster_id: cluster_id, - absent: absent - } - ) do - cluster - |> Multi.new() - |> Multi.execute(fn _ -> - %ClusterHostMarkedAbsent{ - host_id: host_id, - cluster_id: cluster_id, - absent: absent - } - end) - end - def execute( %Cluster{cluster_id: cluster_id} = cluster, %DeregisterClusterHost{ @@ -480,10 +458,6 @@ defmodule Trento.Domain.Cluster do %Cluster{cluster | hosts: List.delete(hosts, host_id)} end - def apply(%Cluster{} = cluster, %ClusterHostMarkedAbsent{absent: absent}) do - %Cluster{cluster | absent: absent} - end - # Deregistration def apply(%Cluster{} = cluster, %ClusterDeregistered{deregistered_at: deregistered_at}) do %Cluster{cluster | deregistered_at: deregistered_at} @@ -491,7 +465,7 @@ defmodule Trento.Domain.Cluster do # Restoration def apply(%Cluster{} = cluster, %ClusterRestored{}) do - %Cluster{cluster | absent: nil, deregistered_at: nil} + %Cluster{cluster | deregistered_at: nil} end def apply(cluster, %legacy_event{}) when legacy_event in @legacy_events, do: cluster diff --git a/lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex b/lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex deleted file mode 100644 index d71a9c7b3e..0000000000 --- a/lib/trento/domain/cluster/commands/mark_cluster_host_absent.ex +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Trento.Domain.Commands.MarkClusterHostAbsent do - @moduledoc """ - Mark a host in a cluster as absent - """ - @required_fields :all - - use Trento.Command - - defcommand do - field :host_id, Ecto.UUID - field :cluster_id, Ecto.UUID - field :absent, :utc_datetime_usec - end -end diff --git a/lib/trento/domain/cluster/events/cluster_host_marked_absent.ex b/lib/trento/domain/cluster/events/cluster_host_marked_absent.ex deleted file mode 100644 index f4461fc485..0000000000 --- a/lib/trento/domain/cluster/events/cluster_host_marked_absent.ex +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Trento.Domain.Events.ClusterHostMarkedAbsent do - @moduledoc """ - This event is emitted when a cluster host is marked as absent - """ - @required_fields :all - - use Trento.Event - - defevent do - field :host_id, Ecto.UUID - field :cluster_id, Ecto.UUID - field :absent, :utc_datetime_usec - end -end diff --git a/test/trento/application/integration/discovery/policies/cluster_policy_test.exs b/test/trento/application/integration/discovery/policies/cluster_policy_test.exs index d614e06acf..7c2c3f5dd7 100644 --- a/test/trento/application/integration/discovery/policies/cluster_policy_test.exs +++ b/test/trento/application/integration/discovery/policies/cluster_policy_test.exs @@ -10,7 +10,7 @@ defmodule Trento.Integration.Discovery.ClusterPolicyTest do alias Trento.Integration.Discovery.ClusterPolicy - alias Trento.Domain.Commands.{DeregisterClusterHost, MarkClusterHostAbsent, RegisterClusterHost} + alias Trento.Domain.Commands.{DeregisterClusterHost, RegisterClusterHost} alias Trento.Domain.{ AscsErsClusterDetails, @@ -1296,7 +1296,7 @@ defmodule Trento.Integration.Discovery.ClusterPolicyTest do {:ok, [ - %MarkClusterHostAbsent{cluster_id: ^current_cluster_id}, + %DeregisterClusterHost{cluster_id: ^current_cluster_id}, %RegisterClusterHost{cluster_id: "34a94290-2236-5e4d-8def-05beb32d14d4"} ]} = "ha_cluster_discovery_hana_scale_up" @@ -1304,12 +1304,12 @@ defmodule Trento.Integration.Discovery.ClusterPolicyTest do |> ClusterPolicy.handle(current_cluster_id) end - test "should mark the host as absent from the current cluster" do + test "should deregister the host from the current cluster" do current_cluster_id = UUID.uuid4() {:ok, [ - %MarkClusterHostAbsent{cluster_id: ^current_cluster_id} + %DeregisterClusterHost{cluster_id: ^current_cluster_id} ]} = "ha_cluster_discovery_unclustered" |> load_discovery_event_fixture() From 2b76bce2f1c997dea55b4a0b0a2c76d07ebd59c1 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 22 Aug 2023 16:00:50 +0200 Subject: [PATCH 03/14] Add tests and rework implementation --- .../discovery/policies/sap_system_policy.ex | 4 +- .../projectors/database_projector.ex | 50 --- .../projectors/sap_system_projector.ex | 50 --- .../read_models/host_read_model.ex | 1 - .../mark_application_instance_absent.ex | 4 +- .../commands/mark_database_instance_absent.ex | 4 +- .../application_instance_marked_absent.ex | 2 +- .../application_instance_marked_present.ex | 13 + .../events/database_instance_marked_absent.ex | 2 +- .../database_instance_marked_present.ex | 13 + lib/trento/domain/sap_system/instance.ex | 2 +- lib/trento/domain/sap_system/sap_system.ex | 186 +++++++-- lib/trento_web/views/v1/sap_system_view.ex | 15 - test/support/factory.ex | 20 + .../policies/sap_system_policy_test.exs | 2 - .../domain/sap_system/sap_system_test.exs | 361 ++++++++++++++++++ 16 files changed, 571 insertions(+), 158 deletions(-) create mode 100644 lib/trento/domain/sap_system/events/application_instance_marked_present.ex create mode 100644 lib/trento/domain/sap_system/events/database_instance_marked_present.ex diff --git a/lib/trento/application/integration/discovery/policies/sap_system_policy.ex b/lib/trento/application/integration/discovery/policies/sap_system_policy.ex index b9222028bc..537ee8bb96 100644 --- a/lib/trento/application/integration/discovery/policies/sap_system_policy.ex +++ b/lib/trento/application/integration/discovery/policies/sap_system_policy.ex @@ -152,7 +152,7 @@ defmodule Trento.Integration.Discovery.SapSystemPolicy do host_id: instance.host_id, instance_number: instance.instance_number, sap_system_id: instance.sap_system_id, - absent: DateTime.utc_now() + absent_at: DateTime.utc_now() }) %DatabaseInstanceReadModel{} = instance -> @@ -160,7 +160,7 @@ defmodule Trento.Integration.Discovery.SapSystemPolicy do host_id: instance.host_id, instance_number: instance.instance_number, sap_system_id: instance.sap_system_id, - absent: DateTime.utc_now() + absent_at: DateTime.utc_now() }) end) end diff --git a/lib/trento/application/projectors/database_projector.ex b/lib/trento/application/projectors/database_projector.ex index 7a66dc9b8e..09b7a21095 100644 --- a/lib/trento/application/projectors/database_projector.ex +++ b/lib/trento/application/projectors/database_projector.ex @@ -19,7 +19,6 @@ defmodule Trento.DatabaseProjector do DatabaseDeregistered, DatabaseHealthChanged, DatabaseInstanceDeregistered, - DatabaseInstanceMarkedAbsent, DatabaseInstanceHealthChanged, DatabaseInstanceRegistered, DatabaseInstanceSystemReplicationChanged, @@ -174,29 +173,6 @@ defmodule Trento.DatabaseProjector do end ) - project( - %DatabaseInstanceMarkedAbsent{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent: absent - }, - fn multi -> - changeset = - DatabaseInstanceReadModel - |> Repo.get_by( - sap_system_id: sap_system_id, - instance_number: instance_number, - host_id: host_id - ) - |> DatabaseInstanceReadModel.changeset(%{ - absent: absent - }) - - Ecto.Multi.update(multi, :database_instance, changeset) - end - ) - project( %DatabaseInstanceDeregistered{ instance_number: instance_number, @@ -345,32 +321,6 @@ defmodule Trento.DatabaseProjector do ) end - @impl true - def after_update( - %DatabaseInstanceMarkedAbsent{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent: absent - }, - _, - %{ - database_instance: %DatabaseInstanceReadModel{sid: sid} - } - ) do - TrentoWeb.Endpoint.broadcast( - @databases_topic, - "database_instance_marked_absent", - SapSystemView.render("instance_marked_absent.json", - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - sid: sid, - absent: absent - ) - ) - end - @impl true def after_update( %DatabaseDeregistered{ diff --git a/lib/trento/application/projectors/sap_system_projector.ex b/lib/trento/application/projectors/sap_system_projector.ex index 69cc8343e0..d8c59392ff 100644 --- a/lib/trento/application/projectors/sap_system_projector.ex +++ b/lib/trento/application/projectors/sap_system_projector.ex @@ -11,7 +11,6 @@ defmodule Trento.SapSystemProjector do alias Trento.Domain.Events.{ ApplicationInstanceDeregistered, ApplicationInstanceHealthChanged, - ApplicationInstanceMarkedAbsent, ApplicationInstanceMoved, ApplicationInstanceRegistered, SapSystemDeregistered, @@ -180,29 +179,6 @@ defmodule Trento.SapSystemProjector do end ) - project( - %ApplicationInstanceMarkedAbsent{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent: absent - }, - fn multi -> - changeset = - ApplicationInstanceReadModel - |> Repo.get_by( - sap_system_id: sap_system_id, - instance_number: instance_number, - host_id: host_id - ) - |> ApplicationInstanceReadModel.changeset(%{ - absent: absent - }) - - Ecto.Multi.update(multi, :application_instance, changeset) - end - ) - project( %ApplicationInstanceDeregistered{ instance_number: instance_number, @@ -372,32 +348,6 @@ defmodule Trento.SapSystemProjector do ) end - @impl true - def after_update( - %ApplicationInstanceMarkedAbsent{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent: absent - }, - _, - %{ - application_instance: %ApplicationInstanceReadModel{sid: sid} - } - ) do - TrentoWeb.Endpoint.broadcast( - @sap_systems_topic, - "application_instance_marked_absent", - SapSystemView.render("instance_marked_absent.json", - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - sid: sid, - absent: absent - ) - ) - end - @impl true def after_update( %ApplicationInstanceDeregistered{ diff --git a/lib/trento/application/read_models/host_read_model.ex b/lib/trento/application/read_models/host_read_model.ex index 76f849e1da..f596daaa89 100644 --- a/lib/trento/application/read_models/host_read_model.ex +++ b/lib/trento/application/read_models/host_read_model.ex @@ -35,7 +35,6 @@ defmodule Trento.HostReadModel do field :last_heartbeat_timestamp, :utc_datetime_usec, virtual: true field :deregistered_at, :utc_datetime_usec - field :absent, :utc_datetime_usec end @spec changeset(t() | Ecto.Changeset.t(), map) :: Ecto.Changeset.t() diff --git a/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex b/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex index ec6e3766ac..5db77fb94c 100644 --- a/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex +++ b/lib/trento/domain/sap_system/commands/mark_application_instance_absent.ex @@ -1,6 +1,6 @@ defmodule Trento.Domain.Commands.MarkApplicationInstanceAbsent do @moduledoc """ - Mark an application instance as absent from the monitoring system. + Mark an application instance as absent """ @required_fields :all @@ -10,6 +10,6 @@ defmodule Trento.Domain.Commands.MarkApplicationInstanceAbsent do field :instance_number, :string field :host_id, Ecto.UUID field :sap_system_id, Ecto.UUID - field :absent, :utc_datetime_usec + field :absent_at, :utc_datetime_usec end end diff --git a/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex b/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex index 51fc51d437..54750d0efb 100644 --- a/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex +++ b/lib/trento/domain/sap_system/commands/mark_database_instance_absent.ex @@ -1,6 +1,6 @@ defmodule Trento.Domain.Commands.MarkDatabaseInstanceAbsent do @moduledoc """ - Mark a database instance as absent from the monitoring system. + Mark a database instance as absent """ @required_fields :all @@ -10,6 +10,6 @@ defmodule Trento.Domain.Commands.MarkDatabaseInstanceAbsent do field :instance_number, :string field :host_id, Ecto.UUID field :sap_system_id, Ecto.UUID - field :absent, :utc_datetime_usec + field :absent_at, :utc_datetime_usec end end diff --git a/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex b/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex index 017a710081..7a85e3baa1 100644 --- a/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex +++ b/lib/trento/domain/sap_system/events/application_instance_marked_absent.ex @@ -9,6 +9,6 @@ defmodule Trento.Domain.Events.ApplicationInstanceMarkedAbsent do field :instance_number, :string field :host_id, Ecto.UUID field :sap_system_id, Ecto.UUID - field :absent, :utc_datetime_usec + field :absent_at, :utc_datetime_usec end end diff --git a/lib/trento/domain/sap_system/events/application_instance_marked_present.ex b/lib/trento/domain/sap_system/events/application_instance_marked_present.ex new file mode 100644 index 0000000000..8650818a33 --- /dev/null +++ b/lib/trento/domain/sap_system/events/application_instance_marked_present.ex @@ -0,0 +1,13 @@ +defmodule Trento.Domain.Events.ApplicationInstanceMarkedPresent do + @moduledoc """ + This event is emitted when an application instance is marked as present in the SAP system. + """ + + use Trento.Event + + defevent do + field :instance_number, :string + field :host_id, Ecto.UUID + field :sap_system_id, Ecto.UUID + end +end diff --git a/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex b/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex index 0d81a686b3..a4665107e4 100644 --- a/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex +++ b/lib/trento/domain/sap_system/events/database_instance_marked_absent.ex @@ -9,6 +9,6 @@ defmodule Trento.Domain.Events.DatabaseInstanceMarkedAbsent do field :instance_number, :string field :host_id, Ecto.UUID field :sap_system_id, Ecto.UUID - field :absent, :utc_datetime_usec + field :absent_at, :utc_datetime_usec end end diff --git a/lib/trento/domain/sap_system/events/database_instance_marked_present.ex b/lib/trento/domain/sap_system/events/database_instance_marked_present.ex new file mode 100644 index 0000000000..283e5c2477 --- /dev/null +++ b/lib/trento/domain/sap_system/events/database_instance_marked_present.ex @@ -0,0 +1,13 @@ +defmodule Trento.Domain.Events.DatabaseInstanceMarkedPresent do + @moduledoc """ + This event is emitted when a database instance is marked as present in the SAP system. + """ + + use Trento.Event + + defevent do + field :instance_number, :string + field :host_id, Ecto.UUID + field :sap_system_id, Ecto.UUID + end +end diff --git a/lib/trento/domain/sap_system/instance.ex b/lib/trento/domain/sap_system/instance.ex index dd72699f54..f45c0b94a4 100644 --- a/lib/trento/domain/sap_system/instance.ex +++ b/lib/trento/domain/sap_system/instance.ex @@ -17,6 +17,6 @@ defmodule Trento.Domain.SapSystem.Instance do field :health, Ecto.Enum, values: Health.values() field :system_replication, :string field :system_replication_status, :string - field :absent, :utc_datetime_usec + field :absent_at, :utc_datetime_usec end end diff --git a/lib/trento/domain/sap_system/sap_system.ex b/lib/trento/domain/sap_system/sap_system.ex index 830bac3c14..44aae132de 100644 --- a/lib/trento/domain/sap_system/sap_system.ex +++ b/lib/trento/domain/sap_system/sap_system.ex @@ -71,6 +71,7 @@ defmodule Trento.Domain.SapSystem do ApplicationInstanceDeregistered, ApplicationInstanceHealthChanged, ApplicationInstanceMarkedAbsent, + ApplicationInstanceMarkedPresent, ApplicationInstanceMoved, ApplicationInstanceRegistered, DatabaseDeregistered, @@ -78,6 +79,7 @@ defmodule Trento.Domain.SapSystem do DatabaseInstanceDeregistered, DatabaseInstanceHealthChanged, DatabaseInstanceMarkedAbsent, + DatabaseInstanceMarkedPresent, DatabaseInstanceRegistered, DatabaseInstanceSystemReplicationChanged, DatabaseRegistered, @@ -241,6 +243,9 @@ defmodule Trento.Domain.SapSystem do |> Multi.execute(fn _ -> maybe_emit_database_instance_registered_event(instance, command) end) + |> Multi.execute(fn _ -> + maybe_emit_database_instance_marked_present_event(instance, command) + end) |> Multi.execute(&maybe_emit_database_health_changed_event/1) |> Multi.execute(&maybe_emit_sap_system_health_changed_event/1) end @@ -260,6 +265,9 @@ defmodule Trento.Domain.SapSystem do instance ) end) + |> Multi.execute(fn sap_system -> + maybe_emit_application_instance_marked_present_event(sap_system, instance) + end) |> Multi.execute(fn sap_system -> maybe_emit_sap_system_restored_event(sap_system, instance) end) @@ -285,6 +293,9 @@ defmodule Trento.Domain.SapSystem do instance ) end) + |> Multi.execute(fn _ -> + maybe_emit_application_instance_marked_present_event(sap_system, instance) + end) |> Multi.execute(fn sap_system -> maybe_emit_application_instance_health_changed_event( sap_system, @@ -305,43 +316,47 @@ defmodule Trento.Domain.SapSystem do end def execute( - %SapSystem{sap_system_id: sap_system_id} = sap_system, + %SapSystem{sap_system_id: sap_system_id, database: %Database{instances: instances}}, %MarkDatabaseInstanceAbsent{ instance_number: instance_number, host_id: host_id, - absent: absent + absent_at: absent_at } ) do - sap_system - |> Multi.new() - |> Multi.execute(fn _ -> - %DatabaseInstanceMarkedAbsent{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent: absent - } - end) + case get_instance(instances, host_id, instance_number) do + %Instance{absent_at: nil} -> + %DatabaseInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + } + + _ -> + nil + end end def execute( - %SapSystem{sap_system_id: sap_system_id} = sap_system, + %SapSystem{sap_system_id: sap_system_id, application: %Application{instances: instances}}, %MarkApplicationInstanceAbsent{ instance_number: instance_number, host_id: host_id, - absent: absent + absent_at: absent_at } ) do - sap_system - |> Multi.new() - |> Multi.execute(fn _ -> - %ApplicationInstanceMarkedAbsent{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent: absent - } - end) + case get_instance(instances, host_id, instance_number) do + %Instance{absent_at: nil} -> + %ApplicationInstanceMarkedAbsent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + } + + _ -> + nil + end end # Deregister a database instance and emit a DatabaseInstanceDeregistered @@ -447,7 +462,8 @@ defmodule Trento.Domain.SapSystem do instance_number: instance_number, features: features, host_id: host_id, - health: health + health: health, + absent_at: nil } | instances ] @@ -536,7 +552,8 @@ defmodule Trento.Domain.SapSystem do instance_number: instance_number, features: features, host_id: host_id, - health: health + health: health, + absent_at: nil } ] } @@ -563,7 +580,8 @@ defmodule Trento.Domain.SapSystem do instance_number: instance_number, features: features, host_id: host_id, - health: health + health: health, + absent_at: nil } | instances ] @@ -664,12 +682,68 @@ defmodule Trento.Domain.SapSystem do snapshot end + def apply( + %SapSystem{database: %Database{instances: instances} = database} = sap_system, + %DatabaseInstanceMarkedPresent{ + instance_number: instance_number, + host_id: host_id + } + ) do + instances = + Enum.map( + instances, + fn instance -> + if instance.instance_number == instance_number and instance.host_id == host_id do + %Instance{instance | absent_at: nil} + else + instance + end + end + ) + + %SapSystem{ + sap_system + | database: %Database{ + database + | instances: instances + } + } + end + + def apply( + %SapSystem{application: %Application{instances: instances} = application} = sap_system, + %ApplicationInstanceMarkedPresent{ + instance_number: instance_number, + host_id: host_id + } + ) do + instances = + Enum.map( + instances, + fn instance -> + if instance.instance_number == instance_number and instance.host_id == host_id do + %Instance{instance | absent_at: nil} + else + instance + end + end + ) + + %SapSystem{ + sap_system + | application: %Application{ + application + | instances: instances + } + } + end + def apply( %SapSystem{database: %Database{instances: instances} = database} = sap_system, %DatabaseInstanceMarkedAbsent{ instance_number: instance_number, host_id: host_id, - absent: absent + absent_at: absent_at } ) do instances = @@ -677,7 +751,7 @@ defmodule Trento.Domain.SapSystem do instances, fn instance -> if instance.instance_number == instance_number and instance.host_id == host_id do - %Instance{instance | absent: absent} + %Instance{instance | absent_at: absent_at} else instance end @@ -698,7 +772,7 @@ defmodule Trento.Domain.SapSystem do %ApplicationInstanceMarkedAbsent{ instance_number: instance_number, host_id: host_id, - absent: absent + absent_at: absent_at } ) do instances = @@ -706,7 +780,7 @@ defmodule Trento.Domain.SapSystem do instances, fn instance -> if instance.instance_number == instance_number and instance.host_id == host_id do - %Instance{instance | absent: absent} + %Instance{instance | absent_at: absent_at} else instance end @@ -856,6 +930,28 @@ defmodule Trento.Domain.SapSystem do defp maybe_emit_database_instance_registered_event(_, _), do: nil + defp maybe_emit_database_instance_marked_present_event( + %Instance{absent_at: nil}, + %RegisterDatabaseInstance{} + ), + do: nil + + defp maybe_emit_database_instance_marked_present_event( + %Instance{ + instance_number: instance_number, + host_id: host_id + }, + %RegisterDatabaseInstance{sap_system_id: sap_system_id} + ) do + %DatabaseInstanceMarkedPresent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id + } + end + + defp maybe_emit_database_instance_marked_present_event(_, _), do: nil + defp maybe_emit_database_instance_system_replication_changed_event( %Instance{ system_replication: system_replication, @@ -998,6 +1094,34 @@ defmodule Trento.Domain.SapSystem do end end + defp maybe_emit_application_instance_marked_present_event( + %SapSystem{ + sap_system_id: sap_system_id, + application: %Application{instances: instances} + }, + %RegisterApplicationInstance{ + instance_number: instance_number, + host_id: host_id + } + ) do + case get_instance(instances, host_id, instance_number) do + %Instance{absent_at: nil} -> + nil + + %Instance{} -> + %ApplicationInstanceMarkedPresent{ + instance_number: instance_number, + host_id: host_id, + sap_system_id: sap_system_id + } + + _ -> + nil + end + end + + defp maybe_emit_application_instance_marked_present_event(_, _), do: nil + defp maybe_emit_application_instance_health_changed_event( %SapSystem{application: %Application{instances: instances}}, %RegisterApplicationInstance{ diff --git a/lib/trento_web/views/v1/sap_system_view.ex b/lib/trento_web/views/v1/sap_system_view.ex index d03e954d35..6d1f20230f 100644 --- a/lib/trento_web/views/v1/sap_system_view.ex +++ b/lib/trento_web/views/v1/sap_system_view.ex @@ -150,21 +150,6 @@ defmodule TrentoWeb.V1.SapSystemView do def render("database_deregistered.json", %{id: id, sid: sid}), do: %{id: id, sid: sid} - def render("instance_marked_absent.json", %{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - sid: sid, - absent: absent - }), - do: %{ - instance_number: instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - sid: sid, - absent: absent - } - def render("instance_deregistered.json", %{ sap_system_id: id, instance_number: instance_number, diff --git a/test/support/factory.ex b/test/support/factory.ex index 49bf60b590..431d5b3b5c 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -22,12 +22,14 @@ defmodule Trento.Factory do alias Trento.Domain.Events.{ ApplicationInstanceDeregistered, + ApplicationInstanceMarkedAbsent, ApplicationInstanceRegistered, ClusterDeregistered, ClusterRegistered, ClusterTombstoned, DatabaseDeregistered, DatabaseInstanceDeregistered, + DatabaseInstanceMarkedAbsent, DatabaseInstanceRegistered, DatabaseRegistered, DatabaseRestored, @@ -260,6 +262,15 @@ defmodule Trento.Factory do } end + def database_instance_marked_absent_event_factory do + DatabaseInstanceMarkedAbsent.new!(%{ + instance_number: "00", + host_id: Faker.UUID.v4(), + sap_system_id: Faker.UUID.v4(), + absent_at: DateTime.utc_now() + }) + end + def database_instance_deregistered_event_factory do DatabaseInstanceDeregistered.new!(%{ instance_number: "00", @@ -307,6 +318,15 @@ defmodule Trento.Factory do } end + def application_instance_marked_absent_event_factory do + ApplicationInstanceMarkedAbsent.new!(%{ + instance_number: "00", + host_id: Faker.UUID.v4(), + sap_system_id: Faker.UUID.v4(), + absent_at: DateTime.utc_now() + }) + end + def application_instance_deregistered_event_factory do ApplicationInstanceDeregistered.new!(%{ sap_system_id: Faker.UUID.v4(), diff --git a/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs b/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs index 3007dc45ab..231524e9e3 100644 --- a/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs +++ b/test/trento/application/integration/discovery/policies/sap_system_policy_test.exs @@ -11,8 +11,6 @@ defmodule Trento.Integration.Discovery.SapSystemPolicyTest do alias Trento.Integration.Discovery.SapSystemPolicy alias Trento.Domain.Commands.{ - DeregisterApplicationInstance, - DeregisterDatabaseInstance, MarkApplicationInstanceAbsent, MarkDatabaseInstanceAbsent, RegisterApplicationInstance, diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index c69bf2a1a3..3a97745366 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -8,6 +8,8 @@ defmodule Trento.SapSystemTest do alias Trento.Domain.Commands.{ DeregisterApplicationInstance, DeregisterDatabaseInstance, + MarkApplicationInstanceAbsent, + MarkDatabaseInstanceAbsent, RegisterApplicationInstance, RegisterDatabaseInstance, RollUpSapSystem @@ -16,12 +18,16 @@ defmodule Trento.SapSystemTest do alias Trento.Domain.Events.{ ApplicationInstanceDeregistered, ApplicationInstanceHealthChanged, + ApplicationInstanceMarkedAbsent, + ApplicationInstanceMarkedPresent, ApplicationInstanceMoved, ApplicationInstanceRegistered, DatabaseDeregistered, DatabaseHealthChanged, DatabaseInstanceDeregistered, DatabaseInstanceHealthChanged, + DatabaseInstanceMarkedAbsent, + DatabaseInstanceMarkedPresent, DatabaseInstanceRegistered, DatabaseInstanceSystemReplicationChanged, DatabaseRegistered, @@ -4202,6 +4208,361 @@ defmodule Trento.SapSystemTest do end end + describe "delta deregistration" do + test "newly registered instances should be marked as present" do + sap_system_id = Faker.UUID.v4() + sid = fake_sid() + ensa_version = EnsaVersion.ensa1() + host_id = Faker.UUID.v4() + + initial_events = [ + build( + :database_registered_event, + sap_system_id: sap_system_id, + sid: sid + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid + ), + build(:application_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + features: "MESSAGESERVER", + host_id: host_id + ), + build( + :sap_system_registered_event, + sap_system_id: sap_system_id, + sid: sid, + ensa_version: ensa_version + ) + ] + + assert_events_and_state( + initial_events, + [], + [], + fn state -> + assert %SapSystem{ + sid: ^sid, + ensa_version: ^ensa_version, + application: %SapSystem.Application{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + absent_at: nil + } + ] + }, + database: %SapSystem.Database{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + absent_at: nil + } + ] + } + } = state + end + ) + end + + test "receiving an 'register instance' command for an already-registered instance sets instance as present if absent" do + sap_system_id = Faker.UUID.v4() + sid = fake_sid() + ensa_version = EnsaVersion.ensa1() + host_id = Faker.UUID.v4() + absent_db_instance_number = "01" + present_db_instance_number = "02" + absent_app_instance_number = "03" + present_app_instance_number = "04" + + initial_events = [ + build( + :database_registered_event, + sap_system_id: sap_system_id, + sid: sid + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: absent_db_instance_number, + system_replication: nil, + system_replication_status: nil + ), + build( + :database_instance_marked_absent_event, + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_db_instance_number, + absent_at: DateTime.utc_now() + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: present_db_instance_number, + system_replication: nil, + system_replication_status: nil + ), + build(:application_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: absent_app_instance_number, + features: "ABAP" + ), + build( + :application_instance_marked_absent_event, + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_app_instance_number, + absent_at: DateTime.utc_now() + ), + build(:application_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: present_app_instance_number, + features: "MESSAGESERVER" + ), + build( + :sap_system_registered_event, + sap_system_id: sap_system_id, + sid: sid, + ensa_version: ensa_version + ) + ] + + assert_events_and_state( + initial_events, + [ + %RegisterDatabaseInstance{ + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_db_instance_number, + health: :passing + }, + %RegisterDatabaseInstance{ + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: present_db_instance_number, + health: :passing + }, + %RegisterApplicationInstance{ + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_app_instance_number, + health: :passing, + ensa_version: ensa_version + }, + %RegisterApplicationInstance{ + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: present_app_instance_number, + health: :passing, + ensa_version: ensa_version + } + ], + [ + %DatabaseInstanceMarkedPresent{ + instance_number: absent_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id + }, + %ApplicationInstanceMarkedPresent{ + instance_number: absent_app_instance_number, + host_id: host_id, + sap_system_id: sap_system_id + } + ], + fn state -> + assert %SapSystem{ + sid: ^sid, + ensa_version: ^ensa_version, + application: %SapSystem.Application{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + absent_at: nil + }, + %SapSystem.Instance{ + absent_at: nil + } + ] + }, + database: %SapSystem.Database{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + absent_at: nil + }, + %SapSystem.Instance{ + absent_at: nil + } + ] + } + } = state + end + ) + end + + test "absent instances receiving 'mark as absent' command should mark as absent" do + sap_system_id = Faker.UUID.v4() + sid = fake_sid() + ensa_version = EnsaVersion.ensa1() + host_id = Faker.UUID.v4() + absent_db_instance_number = "01" + present_db_instance_number = "02" + absent_app_instance_number = "03" + present_app_instance_number = "04" + absent_db_absent_at = DateTime.utc_now() + absent_app_absent_at = DateTime.utc_now() + + initial_events = [ + build( + :database_registered_event, + sap_system_id: sap_system_id, + sid: sid + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: absent_db_instance_number, + system_replication: nil, + system_replication_status: nil + ), + build( + :database_instance_marked_absent_event, + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_db_instance_number, + absent_at: absent_db_absent_at + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: present_db_instance_number, + system_replication: nil, + system_replication_status: nil + ), + build(:application_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: absent_app_instance_number, + features: "MESSAGESERVER" + ), + build( + :application_instance_marked_absent_event, + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_app_instance_number, + absent_at: absent_app_absent_at + ), + build(:application_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: present_app_instance_number, + features: "ABAP" + ), + build( + :sap_system_registered_event, + sap_system_id: sap_system_id, + sid: sid, + ensa_version: ensa_version + ) + ] + + absent_at = DateTime.utc_now() + + assert_events_and_state( + initial_events, + [ + %MarkDatabaseInstanceAbsent{ + instance_number: absent_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + }, + %MarkDatabaseInstanceAbsent{ + instance_number: present_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + }, + %MarkApplicationInstanceAbsent{ + instance_number: absent_app_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + }, + %MarkApplicationInstanceAbsent{ + instance_number: present_app_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + } + ], + [ + %DatabaseInstanceMarkedAbsent{ + instance_number: present_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + }, + %ApplicationInstanceMarkedAbsent{ + instance_number: present_app_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + } + ], + fn state -> + assert %SapSystem{ + sid: ^sid, + database: %SapSystem.Database{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + instance_number: ^present_db_instance_number, + absent_at: ^absent_at + }, + %SapSystem.Instance{ + instance_number: ^absent_db_instance_number, + absent_at: ^absent_db_absent_at + } + ] + }, + application: %SapSystem.Application{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + instance_number: ^present_app_instance_number, + absent_at: ^absent_at + }, + %SapSystem.Instance{ + instance_number: ^absent_app_instance_number, + absent_at: ^absent_app_absent_at + } + ] + } + } = state + end + ) + end + end + defp fake_sid, do: Enum.join([Faker.Util.letter(), Faker.Util.letter(), Faker.Util.letter()]) end From ba582d45ace8b237449d434fb76a5e03ba438bec Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 29 Aug 2023 15:16:51 +0200 Subject: [PATCH 04/14] Abstract repeated code into a private helper function --- lib/trento/domain/sap_system/sap_system.ex | 61 ++++++---------------- 1 file changed, 17 insertions(+), 44 deletions(-) diff --git a/lib/trento/domain/sap_system/sap_system.ex b/lib/trento/domain/sap_system/sap_system.ex index 44aae132de..71cf394af0 100644 --- a/lib/trento/domain/sap_system/sap_system.ex +++ b/lib/trento/domain/sap_system/sap_system.ex @@ -689,17 +689,7 @@ defmodule Trento.Domain.SapSystem do host_id: host_id } ) do - instances = - Enum.map( - instances, - fn instance -> - if instance.instance_number == instance_number and instance.host_id == host_id do - %Instance{instance | absent_at: nil} - else - instance - end - end - ) + instances = update_instance(instances, instance_number, host_id, :absent_at, nil) %SapSystem{ sap_system @@ -717,17 +707,7 @@ defmodule Trento.Domain.SapSystem do host_id: host_id } ) do - instances = - Enum.map( - instances, - fn instance -> - if instance.instance_number == instance_number and instance.host_id == host_id do - %Instance{instance | absent_at: nil} - else - instance - end - end - ) + instances = update_instance(instances, instance_number, host_id, :absent_at, nil) %SapSystem{ sap_system @@ -746,17 +726,7 @@ defmodule Trento.Domain.SapSystem do absent_at: absent_at } ) do - instances = - Enum.map( - instances, - fn instance -> - if instance.instance_number == instance_number and instance.host_id == host_id do - %Instance{instance | absent_at: absent_at} - else - instance - end - end - ) + instances = update_instance(instances, instance_number, host_id, :absent_at, absent_at) %SapSystem{ sap_system @@ -775,17 +745,7 @@ defmodule Trento.Domain.SapSystem do absent_at: absent_at } ) do - instances = - Enum.map( - instances, - fn instance -> - if instance.instance_number == instance_number and instance.host_id == host_id do - %Instance{instance | absent_at: absent_at} - else - instance - end - end - ) + instances = update_instance(instances, instance_number, host_id, :absent_at, absent_at) %SapSystem{ sap_system @@ -1425,4 +1385,17 @@ defmodule Trento.Domain.SapSystem do false end) end + + defp update_instance(instances, instance_number, host_id, key, value) do + Enum.map( + instances, + fn instance -> + if instance.instance_number == instance_number and instance.host_id == host_id do + Map.put(instance, key, value) + else + instance + end + end + ) + end end From 18b8113eb0f06dd629d4a7ffeeb831c199fe46d1 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 29 Aug 2023 18:02:18 +0200 Subject: [PATCH 05/14] Reordering tests --- .../domain/sap_system/sap_system_test.exs | 160 +++++++++--------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index 3a97745366..6509050762 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -4208,7 +4208,7 @@ defmodule Trento.SapSystemTest do end end - describe "delta deregistration" do + describe "instance marked absent/present" do test "newly registered instances should be marked as present" do sap_system_id = Faker.UUID.v4() sid = fake_sid() @@ -4269,7 +4269,7 @@ defmodule Trento.SapSystemTest do ) end - test "receiving an 'register instance' command for an already-registered instance sets instance as present if absent" do + test "should mark as absent a previously registered instance" do sap_system_id = Faker.UUID.v4() sid = fake_sid() ensa_version = EnsaVersion.ensa1() @@ -4278,6 +4278,8 @@ defmodule Trento.SapSystemTest do present_db_instance_number = "02" absent_app_instance_number = "03" present_app_instance_number = "04" + absent_db_absent_at = DateTime.utc_now() + absent_app_absent_at = DateTime.utc_now() initial_events = [ build( @@ -4299,7 +4301,7 @@ defmodule Trento.SapSystemTest do sap_system_id: sap_system_id, host_id: host_id, instance_number: absent_db_instance_number, - absent_at: DateTime.utc_now() + absent_at: absent_db_absent_at ), build( :database_instance_registered_event, @@ -4315,21 +4317,21 @@ defmodule Trento.SapSystemTest do sid: sid, host_id: host_id, instance_number: absent_app_instance_number, - features: "ABAP" + features: "MESSAGESERVER" ), build( :application_instance_marked_absent_event, sap_system_id: sap_system_id, host_id: host_id, instance_number: absent_app_instance_number, - absent_at: DateTime.utc_now() + absent_at: absent_app_absent_at ), build(:application_instance_registered_event, sap_system_id: sap_system_id, sid: sid, host_id: host_id, instance_number: present_app_instance_number, - features: "MESSAGESERVER" + features: "ABAP" ), build( :sap_system_registered_event, @@ -4339,71 +4341,76 @@ defmodule Trento.SapSystemTest do ) ] + absent_at = DateTime.utc_now() + assert_events_and_state( initial_events, [ - %RegisterDatabaseInstance{ - sap_system_id: sap_system_id, - host_id: host_id, + %MarkDatabaseInstanceAbsent{ instance_number: absent_db_instance_number, - health: :passing - }, - %RegisterDatabaseInstance{ - sap_system_id: sap_system_id, host_id: host_id, - instance_number: present_db_instance_number, - health: :passing - }, - %RegisterApplicationInstance{ sap_system_id: sap_system_id, - host_id: host_id, - instance_number: absent_app_instance_number, - health: :passing, - ensa_version: ensa_version + absent_at: absent_at }, - %RegisterApplicationInstance{ + %MarkDatabaseInstanceAbsent{ + instance_number: present_db_instance_number, + host_id: host_id, sap_system_id: sap_system_id, + absent_at: absent_at + }, + %MarkApplicationInstanceAbsent{ + instance_number: absent_app_instance_number, host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + }, + %MarkApplicationInstanceAbsent{ instance_number: present_app_instance_number, - health: :passing, - ensa_version: ensa_version + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at } ], [ - %DatabaseInstanceMarkedPresent{ - instance_number: absent_db_instance_number, + %DatabaseInstanceMarkedAbsent{ + instance_number: present_db_instance_number, host_id: host_id, - sap_system_id: sap_system_id + sap_system_id: sap_system_id, + absent_at: absent_at }, - %ApplicationInstanceMarkedPresent{ - instance_number: absent_app_instance_number, + %ApplicationInstanceMarkedAbsent{ + instance_number: present_app_instance_number, host_id: host_id, - sap_system_id: sap_system_id + sap_system_id: sap_system_id, + absent_at: absent_at } ], fn state -> assert %SapSystem{ sid: ^sid, - ensa_version: ^ensa_version, - application: %SapSystem.Application{ + database: %SapSystem.Database{ sid: ^sid, instances: [ %SapSystem.Instance{ - absent_at: nil + instance_number: ^present_db_instance_number, + absent_at: ^absent_at }, %SapSystem.Instance{ - absent_at: nil + instance_number: ^absent_db_instance_number, + absent_at: ^absent_db_absent_at } ] }, - database: %SapSystem.Database{ + application: %SapSystem.Application{ sid: ^sid, instances: [ %SapSystem.Instance{ - absent_at: nil + instance_number: ^present_app_instance_number, + absent_at: ^absent_at }, %SapSystem.Instance{ - absent_at: nil + instance_number: ^absent_app_instance_number, + absent_at: ^absent_app_absent_at } ] } @@ -4412,7 +4419,7 @@ defmodule Trento.SapSystemTest do ) end - test "absent instances receiving 'mark as absent' command should mark as absent" do + test "receiving an 'register instance' command for an already-registered instance sets instance as present if absent" do sap_system_id = Faker.UUID.v4() sid = fake_sid() ensa_version = EnsaVersion.ensa1() @@ -4421,8 +4428,6 @@ defmodule Trento.SapSystemTest do present_db_instance_number = "02" absent_app_instance_number = "03" present_app_instance_number = "04" - absent_db_absent_at = DateTime.utc_now() - absent_app_absent_at = DateTime.utc_now() initial_events = [ build( @@ -4444,7 +4449,7 @@ defmodule Trento.SapSystemTest do sap_system_id: sap_system_id, host_id: host_id, instance_number: absent_db_instance_number, - absent_at: absent_db_absent_at + absent_at: DateTime.utc_now() ), build( :database_instance_registered_event, @@ -4460,21 +4465,21 @@ defmodule Trento.SapSystemTest do sid: sid, host_id: host_id, instance_number: absent_app_instance_number, - features: "MESSAGESERVER" + features: "ABAP" ), build( :application_instance_marked_absent_event, sap_system_id: sap_system_id, host_id: host_id, instance_number: absent_app_instance_number, - absent_at: absent_app_absent_at + absent_at: DateTime.utc_now() ), build(:application_instance_registered_event, sap_system_id: sap_system_id, sid: sid, host_id: host_id, instance_number: present_app_instance_number, - features: "ABAP" + features: "MESSAGESERVER" ), build( :sap_system_registered_event, @@ -4484,76 +4489,71 @@ defmodule Trento.SapSystemTest do ) ] - absent_at = DateTime.utc_now() - assert_events_and_state( initial_events, [ - %MarkDatabaseInstanceAbsent{ - instance_number: absent_db_instance_number, - host_id: host_id, + %RegisterDatabaseInstance{ sap_system_id: sap_system_id, - absent_at: absent_at - }, - %MarkDatabaseInstanceAbsent{ - instance_number: present_db_instance_number, host_id: host_id, - sap_system_id: sap_system_id, - absent_at: absent_at + instance_number: absent_db_instance_number, + health: :passing }, - %MarkApplicationInstanceAbsent{ - instance_number: absent_app_instance_number, - host_id: host_id, + %RegisterDatabaseInstance{ sap_system_id: sap_system_id, - absent_at: absent_at + host_id: host_id, + instance_number: present_db_instance_number, + health: :passing }, - %MarkApplicationInstanceAbsent{ - instance_number: present_app_instance_number, + %RegisterApplicationInstance{ + sap_system_id: sap_system_id, host_id: host_id, + instance_number: absent_app_instance_number, + health: :passing, + ensa_version: ensa_version + }, + %RegisterApplicationInstance{ sap_system_id: sap_system_id, - absent_at: absent_at + host_id: host_id, + instance_number: present_app_instance_number, + health: :passing, + ensa_version: ensa_version } ], [ - %DatabaseInstanceMarkedAbsent{ - instance_number: present_db_instance_number, + %DatabaseInstanceMarkedPresent{ + instance_number: absent_db_instance_number, host_id: host_id, - sap_system_id: sap_system_id, - absent_at: absent_at + sap_system_id: sap_system_id }, - %ApplicationInstanceMarkedAbsent{ - instance_number: present_app_instance_number, + %ApplicationInstanceMarkedPresent{ + instance_number: absent_app_instance_number, host_id: host_id, - sap_system_id: sap_system_id, - absent_at: absent_at + sap_system_id: sap_system_id } ], fn state -> assert %SapSystem{ sid: ^sid, - database: %SapSystem.Database{ + ensa_version: ^ensa_version, + application: %SapSystem.Application{ sid: ^sid, instances: [ %SapSystem.Instance{ - instance_number: ^present_db_instance_number, - absent_at: ^absent_at + absent_at: nil }, %SapSystem.Instance{ - instance_number: ^absent_db_instance_number, - absent_at: ^absent_db_absent_at + absent_at: nil } ] }, - application: %SapSystem.Application{ + database: %SapSystem.Database{ sid: ^sid, instances: [ %SapSystem.Instance{ - instance_number: ^present_app_instance_number, - absent_at: ^absent_at + absent_at: nil }, %SapSystem.Instance{ - instance_number: ^absent_app_instance_number, - absent_at: ^absent_app_absent_at + absent_at: nil } ] } From 1eccd967c721ede3fc5f6244b4a2517ad237204d Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 29 Aug 2023 18:22:35 +0200 Subject: [PATCH 06/14] Move test for initial conditions into pre-existing tests --- .../domain/sap_system/sap_system_test.exs | 66 ++----------------- 1 file changed, 4 insertions(+), 62 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index 6509050762..927a496024 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -129,7 +129,8 @@ defmodule Trento.SapSystemTest do instance_number: instance_number, features: features, host_id: host_id, - health: :passing + health: :passing, + absent_at: nil } ] } @@ -431,7 +432,8 @@ defmodule Trento.SapSystemTest do instance_number: "10", features: "ABAP", host_id: ^host_id, - health: :passing + health: :passing, + absent_at: nil }, %SapSystem.Instance{ features: "MESSAGESERVER" @@ -4209,66 +4211,6 @@ defmodule Trento.SapSystemTest do end describe "instance marked absent/present" do - test "newly registered instances should be marked as present" do - sap_system_id = Faker.UUID.v4() - sid = fake_sid() - ensa_version = EnsaVersion.ensa1() - host_id = Faker.UUID.v4() - - initial_events = [ - build( - :database_registered_event, - sap_system_id: sap_system_id, - sid: sid - ), - build( - :database_instance_registered_event, - sap_system_id: sap_system_id, - sid: sid - ), - build(:application_instance_registered_event, - sap_system_id: sap_system_id, - sid: sid, - features: "MESSAGESERVER", - host_id: host_id - ), - build( - :sap_system_registered_event, - sap_system_id: sap_system_id, - sid: sid, - ensa_version: ensa_version - ) - ] - - assert_events_and_state( - initial_events, - [], - [], - fn state -> - assert %SapSystem{ - sid: ^sid, - ensa_version: ^ensa_version, - application: %SapSystem.Application{ - sid: ^sid, - instances: [ - %SapSystem.Instance{ - absent_at: nil - } - ] - }, - database: %SapSystem.Database{ - sid: ^sid, - instances: [ - %SapSystem.Instance{ - absent_at: nil - } - ] - } - } = state - end - ) - end - test "should mark as absent a previously registered instance" do sap_system_id = Faker.UUID.v4() sid = fake_sid() From 50c36f755fbd9c1cbda5d29547c0e04bcc027517 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 29 Aug 2023 18:57:08 +0200 Subject: [PATCH 07/14] Separate database/application instance tests --- .../domain/sap_system/sap_system_test.exs | 214 ++++++++++++------ 1 file changed, 139 insertions(+), 75 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index 927a496024..5a346f2713 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -4211,17 +4211,13 @@ defmodule Trento.SapSystemTest do end describe "instance marked absent/present" do - test "should mark as absent a previously registered instance" do + test "should mark as absent a previously registered database instance" do sap_system_id = Faker.UUID.v4() sid = fake_sid() - ensa_version = EnsaVersion.ensa1() host_id = Faker.UUID.v4() absent_db_instance_number = "01" present_db_instance_number = "02" - absent_app_instance_number = "03" - present_app_instance_number = "04" absent_db_absent_at = DateTime.utc_now() - absent_app_absent_at = DateTime.utc_now() initial_events = [ build( @@ -4253,6 +4249,77 @@ defmodule Trento.SapSystemTest do instance_number: present_db_instance_number, system_replication: nil, system_replication_status: nil + ) + ] + + absent_at = DateTime.utc_now() + + assert_events_and_state( + initial_events, + [ + %MarkDatabaseInstanceAbsent{ + instance_number: absent_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + }, + %MarkDatabaseInstanceAbsent{ + instance_number: present_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + } + ], + [ + %DatabaseInstanceMarkedAbsent{ + instance_number: present_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id, + absent_at: absent_at + } + ], + fn state -> + assert %SapSystem{ + database: %SapSystem.Database{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + instance_number: ^present_db_instance_number, + absent_at: ^absent_at + }, + %SapSystem.Instance{ + instance_number: ^absent_db_instance_number, + absent_at: ^absent_db_absent_at + } + ] + } + } = state + end + ) + end + + test "should mark as absent a previously registered application instance" do + sap_system_id = Faker.UUID.v4() + sid = fake_sid() + host_id = Faker.UUID.v4() + absent_app_instance_number = "02" + present_app_instance_number = "03" + absent_app_absent_at = DateTime.utc_now() + + initial_events = [ + build( + :database_registered_event, + sap_system_id: sap_system_id, + sid: sid + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: "01", + system_replication: nil, + system_replication_status: nil ), build(:application_instance_registered_event, sap_system_id: sap_system_id, @@ -4274,12 +4341,6 @@ defmodule Trento.SapSystemTest do host_id: host_id, instance_number: present_app_instance_number, features: "ABAP" - ), - build( - :sap_system_registered_event, - sap_system_id: sap_system_id, - sid: sid, - ensa_version: ensa_version ) ] @@ -4288,18 +4349,6 @@ defmodule Trento.SapSystemTest do assert_events_and_state( initial_events, [ - %MarkDatabaseInstanceAbsent{ - instance_number: absent_db_instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent_at: absent_at - }, - %MarkDatabaseInstanceAbsent{ - instance_number: present_db_instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent_at: absent_at - }, %MarkApplicationInstanceAbsent{ instance_number: absent_app_instance_number, host_id: host_id, @@ -4314,12 +4363,6 @@ defmodule Trento.SapSystemTest do } ], [ - %DatabaseInstanceMarkedAbsent{ - instance_number: present_db_instance_number, - host_id: host_id, - sap_system_id: sap_system_id, - absent_at: absent_at - }, %ApplicationInstanceMarkedAbsent{ instance_number: present_app_instance_number, host_id: host_id, @@ -4329,20 +4372,6 @@ defmodule Trento.SapSystemTest do ], fn state -> assert %SapSystem{ - sid: ^sid, - database: %SapSystem.Database{ - sid: ^sid, - instances: [ - %SapSystem.Instance{ - instance_number: ^present_db_instance_number, - absent_at: ^absent_at - }, - %SapSystem.Instance{ - instance_number: ^absent_db_instance_number, - absent_at: ^absent_db_absent_at - } - ] - }, application: %SapSystem.Application{ sid: ^sid, instances: [ @@ -4361,15 +4390,12 @@ defmodule Trento.SapSystemTest do ) end - test "receiving an 'register instance' command for an already-registered instance sets instance as present if absent" do + test "receiving a 'register instance' command for an already-registered database instance sets instance as present if absent" do sap_system_id = Faker.UUID.v4() sid = fake_sid() - ensa_version = EnsaVersion.ensa1() host_id = Faker.UUID.v4() absent_db_instance_number = "01" present_db_instance_number = "02" - absent_app_instance_number = "03" - present_app_instance_number = "04" initial_events = [ build( @@ -4401,6 +4427,72 @@ defmodule Trento.SapSystemTest do instance_number: present_db_instance_number, system_replication: nil, system_replication_status: nil + ) + ] + + assert_events_and_state( + initial_events, + [ + %RegisterDatabaseInstance{ + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: absent_db_instance_number, + health: :passing + }, + %RegisterDatabaseInstance{ + sap_system_id: sap_system_id, + host_id: host_id, + instance_number: present_db_instance_number, + health: :passing + } + ], + [ + %DatabaseInstanceMarkedPresent{ + instance_number: absent_db_instance_number, + host_id: host_id, + sap_system_id: sap_system_id + } + ], + fn state -> + assert %SapSystem{ + database: %SapSystem.Database{ + sid: ^sid, + instances: [ + %SapSystem.Instance{ + absent_at: nil + }, + %SapSystem.Instance{ + absent_at: nil + } + ] + } + } = state + end + ) + end + + test "receiving a 'register instance' command for an already-registered application instance sets instance as present if absent" do + sap_system_id = Faker.UUID.v4() + sid = fake_sid() + ensa_version = EnsaVersion.ensa1() + host_id = Faker.UUID.v4() + absent_app_instance_number = "02" + present_app_instance_number = "03" + + initial_events = [ + build( + :database_registered_event, + sap_system_id: sap_system_id, + sid: sid + ), + build( + :database_instance_registered_event, + sap_system_id: sap_system_id, + sid: sid, + host_id: host_id, + instance_number: "01", + system_replication: nil, + system_replication_status: nil ), build(:application_instance_registered_event, sap_system_id: sap_system_id, @@ -4434,18 +4526,6 @@ defmodule Trento.SapSystemTest do assert_events_and_state( initial_events, [ - %RegisterDatabaseInstance{ - sap_system_id: sap_system_id, - host_id: host_id, - instance_number: absent_db_instance_number, - health: :passing - }, - %RegisterDatabaseInstance{ - sap_system_id: sap_system_id, - host_id: host_id, - instance_number: present_db_instance_number, - health: :passing - }, %RegisterApplicationInstance{ sap_system_id: sap_system_id, host_id: host_id, @@ -4462,11 +4542,6 @@ defmodule Trento.SapSystemTest do } ], [ - %DatabaseInstanceMarkedPresent{ - instance_number: absent_db_instance_number, - host_id: host_id, - sap_system_id: sap_system_id - }, %ApplicationInstanceMarkedPresent{ instance_number: absent_app_instance_number, host_id: host_id, @@ -4487,17 +4562,6 @@ defmodule Trento.SapSystemTest do absent_at: nil } ] - }, - database: %SapSystem.Database{ - sid: ^sid, - instances: [ - %SapSystem.Instance{ - absent_at: nil - }, - %SapSystem.Instance{ - absent_at: nil - } - ] } } = state end From 919f2575cdd6d599f78e01de482de103255eb87e Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Tue, 29 Aug 2023 19:23:01 +0200 Subject: [PATCH 08/14] Refactor `update_instance()` to use pattern-matching --- lib/trento/domain/sap_system/sap_system.ex | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/trento/domain/sap_system/sap_system.ex b/lib/trento/domain/sap_system/sap_system.ex index 71cf394af0..22f29ae878 100644 --- a/lib/trento/domain/sap_system/sap_system.ex +++ b/lib/trento/domain/sap_system/sap_system.ex @@ -101,15 +101,15 @@ defmodule Trento.Domain.SapSystem do use Trento.Type deftype do - field :sap_system_id, Ecto.UUID - field :sid, :string, default: nil - field :health, Ecto.Enum, values: Health.values() - field :ensa_version, Ecto.Enum, values: EnsaVersion.values(), default: EnsaVersion.no_ensa() - field :rolling_up, :boolean, default: false - field :deregistered_at, :utc_datetime_usec, default: nil - - embeds_one :database, Database - embeds_one :application, Application + field(:sap_system_id, Ecto.UUID) + field(:sid, :string, default: nil) + field(:health, Ecto.Enum, values: Health.values()) + field(:ensa_version, Ecto.Enum, values: EnsaVersion.values(), default: EnsaVersion.no_ensa()) + field(:rolling_up, :boolean, default: false) + field(:deregistered_at, :utc_datetime_usec, default: nil) + + embeds_one(:database, Database) + embeds_one(:application, Application) end # Stop everything during the rollup process @@ -689,7 +689,7 @@ defmodule Trento.Domain.SapSystem do host_id: host_id } ) do - instances = update_instance(instances, instance_number, host_id, :absent_at, nil) + instances = update_instance(instances, instance_number, host_id, %{absent_at: nil}) %SapSystem{ sap_system @@ -707,7 +707,7 @@ defmodule Trento.Domain.SapSystem do host_id: host_id } ) do - instances = update_instance(instances, instance_number, host_id, :absent_at, nil) + instances = update_instance(instances, instance_number, host_id, %{absent_at: nil}) %SapSystem{ sap_system @@ -726,7 +726,7 @@ defmodule Trento.Domain.SapSystem do absent_at: absent_at } ) do - instances = update_instance(instances, instance_number, host_id, :absent_at, absent_at) + instances = update_instance(instances, instance_number, host_id, %{absent_at: absent_at}) %SapSystem{ sap_system @@ -745,7 +745,7 @@ defmodule Trento.Domain.SapSystem do absent_at: absent_at } ) do - instances = update_instance(instances, instance_number, host_id, :absent_at, absent_at) + instances = update_instance(instances, instance_number, host_id, %{absent_at: absent_at}) %SapSystem{ sap_system @@ -1386,15 +1386,15 @@ defmodule Trento.Domain.SapSystem do end) end - defp update_instance(instances, instance_number, host_id, key, value) do + defp update_instance(instances, instance_number, host_id, fields) do Enum.map( instances, - fn instance -> - if instance.instance_number == instance_number and instance.host_id == host_id do - Map.put(instance, key, value) - else + fn + %Instance{instance_number: ^instance_number, host_id: ^host_id} = instance -> + struct(instance, fields) + + instance -> instance - end end ) end From f69ecd3f8cf37cd69aeac60e4715bfd870beb276 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Wed, 30 Aug 2023 09:46:15 +0200 Subject: [PATCH 09/14] Revert formatting --- lib/trento/domain/sap_system/sap_system.ex | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/trento/domain/sap_system/sap_system.ex b/lib/trento/domain/sap_system/sap_system.ex index 22f29ae878..037f52fa09 100644 --- a/lib/trento/domain/sap_system/sap_system.ex +++ b/lib/trento/domain/sap_system/sap_system.ex @@ -101,15 +101,15 @@ defmodule Trento.Domain.SapSystem do use Trento.Type deftype do - field(:sap_system_id, Ecto.UUID) - field(:sid, :string, default: nil) - field(:health, Ecto.Enum, values: Health.values()) - field(:ensa_version, Ecto.Enum, values: EnsaVersion.values(), default: EnsaVersion.no_ensa()) - field(:rolling_up, :boolean, default: false) - field(:deregistered_at, :utc_datetime_usec, default: nil) - - embeds_one(:database, Database) - embeds_one(:application, Application) + field :sap_system_id, Ecto.UUID + field :sid, :string, default: nil + field :health, Ecto.Enum, values: Health.values() + field :ensa_version, Ecto.Enum, values: EnsaVersion.values(), default: EnsaVersion.no_ensa() + field :rolling_up, :boolean, default: false + field :deregistered_at, :utc_datetime_usec, default: nil + + embeds_one :database, Database + embeds_one :application, Application end # Stop everything during the rollup process From 9c5105fac285f8496e249877c1bb311bb2b3f91f Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Wed, 30 Aug 2023 09:48:13 +0200 Subject: [PATCH 10/14] Use namespaced `Kernel.struct()` --- lib/trento/domain/sap_system/sap_system.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/trento/domain/sap_system/sap_system.ex b/lib/trento/domain/sap_system/sap_system.ex index 037f52fa09..07b618ff9d 100644 --- a/lib/trento/domain/sap_system/sap_system.ex +++ b/lib/trento/domain/sap_system/sap_system.ex @@ -1391,7 +1391,7 @@ defmodule Trento.Domain.SapSystem do instances, fn %Instance{instance_number: ^instance_number, host_id: ^host_id} = instance -> - struct(instance, fields) + Kernel.struct(instance, fields) instance -> instance From 7cfc0724e3d73022762e13524f86da9810674225 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Wed, 30 Aug 2023 10:15:25 +0200 Subject: [PATCH 11/14] Renaming --- test/trento/domain/sap_system/sap_system_test.exs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index 5a346f2713..35a1629ff2 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -4302,7 +4302,7 @@ defmodule Trento.SapSystemTest do sap_system_id = Faker.UUID.v4() sid = fake_sid() host_id = Faker.UUID.v4() - absent_app_instance_number = "02" + absent_message_server_instance_number = "02" present_app_instance_number = "03" absent_app_absent_at = DateTime.utc_now() @@ -4325,14 +4325,14 @@ defmodule Trento.SapSystemTest do sap_system_id: sap_system_id, sid: sid, host_id: host_id, - instance_number: absent_app_instance_number, + instance_number: absent_message_server_instance_number, features: "MESSAGESERVER" ), build( :application_instance_marked_absent_event, sap_system_id: sap_system_id, host_id: host_id, - instance_number: absent_app_instance_number, + instance_number: absent_message_server_instance_number, absent_at: absent_app_absent_at ), build(:application_instance_registered_event, @@ -4350,7 +4350,7 @@ defmodule Trento.SapSystemTest do initial_events, [ %MarkApplicationInstanceAbsent{ - instance_number: absent_app_instance_number, + instance_number: absent_message_server_instance_number, host_id: host_id, sap_system_id: sap_system_id, absent_at: absent_at @@ -4380,7 +4380,7 @@ defmodule Trento.SapSystemTest do absent_at: ^absent_at }, %SapSystem.Instance{ - instance_number: ^absent_app_instance_number, + instance_number: ^absent_message_server_instance_number, absent_at: ^absent_app_absent_at } ] @@ -4390,7 +4390,7 @@ defmodule Trento.SapSystemTest do ) end - test "receiving a 'register instance' command for an already-registered database instance sets instance as present if absent" do + test "should mark as present an already registered, absent database instance" do sap_system_id = Faker.UUID.v4() sid = fake_sid() host_id = Faker.UUID.v4() @@ -4471,7 +4471,7 @@ defmodule Trento.SapSystemTest do ) end - test "receiving a 'register instance' command for an already-registered application instance sets instance as present if absent" do + test "should mark as present an already registered, absent application instance" do sap_system_id = Faker.UUID.v4() sid = fake_sid() ensa_version = EnsaVersion.ensa1() From 64a3e016a5a095d463cd31596302acbd1f538181 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Wed, 30 Aug 2023 10:19:53 +0200 Subject: [PATCH 12/14] Remove `SapSystem` namespace --- .../domain/sap_system/sap_system_test.exs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index 35a1629ff2..b4a277a40c 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -4280,14 +4280,14 @@ defmodule Trento.SapSystemTest do ], fn state -> assert %SapSystem{ - database: %SapSystem.Database{ + database: %Database{ sid: ^sid, instances: [ - %SapSystem.Instance{ + %Instance{ instance_number: ^present_db_instance_number, absent_at: ^absent_at }, - %SapSystem.Instance{ + %Instance{ instance_number: ^absent_db_instance_number, absent_at: ^absent_db_absent_at } @@ -4372,14 +4372,14 @@ defmodule Trento.SapSystemTest do ], fn state -> assert %SapSystem{ - application: %SapSystem.Application{ + application: %Application{ sid: ^sid, instances: [ - %SapSystem.Instance{ + %Instance{ instance_number: ^present_app_instance_number, absent_at: ^absent_at }, - %SapSystem.Instance{ + %Instance{ instance_number: ^absent_message_server_instance_number, absent_at: ^absent_app_absent_at } @@ -4455,13 +4455,13 @@ defmodule Trento.SapSystemTest do ], fn state -> assert %SapSystem{ - database: %SapSystem.Database{ + database: %Database{ sid: ^sid, instances: [ - %SapSystem.Instance{ + %Instance{ absent_at: nil }, - %SapSystem.Instance{ + %Instance{ absent_at: nil } ] @@ -4552,13 +4552,13 @@ defmodule Trento.SapSystemTest do assert %SapSystem{ sid: ^sid, ensa_version: ^ensa_version, - application: %SapSystem.Application{ + application: %Application{ sid: ^sid, instances: [ - %SapSystem.Instance{ + %Instance{ absent_at: nil }, - %SapSystem.Instance{ + %Instance{ absent_at: nil } ] From f322059c7e908220a9fd205fea3ee07189a25354 Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Wed, 30 Aug 2023 10:22:51 +0200 Subject: [PATCH 13/14] Remove redundant initialisation of default fields --- test/trento/domain/sap_system/sap_system_test.exs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index b4a277a40c..e2ca175e41 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -4505,8 +4505,7 @@ defmodule Trento.SapSystemTest do :application_instance_marked_absent_event, sap_system_id: sap_system_id, host_id: host_id, - instance_number: absent_app_instance_number, - absent_at: DateTime.utc_now() + instance_number: absent_app_instance_number ), build(:application_instance_registered_event, sap_system_id: sap_system_id, From 6a6f2f4b9d42e5e02ac8c8c6679bec88d7fbacef Mon Sep 17 00:00:00 2001 From: Jamie Rodriguez Date: Wed, 30 Aug 2023 10:26:19 +0200 Subject: [PATCH 14/14] Renaming --- test/trento/domain/sap_system/sap_system_test.exs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/trento/domain/sap_system/sap_system_test.exs b/test/trento/domain/sap_system/sap_system_test.exs index e2ca175e41..8e0eba43a6 100644 --- a/test/trento/domain/sap_system/sap_system_test.exs +++ b/test/trento/domain/sap_system/sap_system_test.exs @@ -4477,7 +4477,7 @@ defmodule Trento.SapSystemTest do ensa_version = EnsaVersion.ensa1() host_id = Faker.UUID.v4() absent_app_instance_number = "02" - present_app_instance_number = "03" + present_message_server_instance_number = "03" initial_events = [ build( @@ -4511,7 +4511,7 @@ defmodule Trento.SapSystemTest do sap_system_id: sap_system_id, sid: sid, host_id: host_id, - instance_number: present_app_instance_number, + instance_number: present_message_server_instance_number, features: "MESSAGESERVER" ), build( @@ -4535,7 +4535,7 @@ defmodule Trento.SapSystemTest do %RegisterApplicationInstance{ sap_system_id: sap_system_id, host_id: host_id, - instance_number: present_app_instance_number, + instance_number: present_message_server_instance_number, health: :passing, ensa_version: ensa_version }