Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add parent cluster resource #3276

Merged
merged 3 commits into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/trento/clusters/value_objects/cluster_resource.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,16 @@ defmodule Trento.Clusters.ValueObjects.ClusterResource do

use Trento.Support.Type

alias Trento.Clusters.ValueObjects.ClusterResourceParent

deftype do
field :id, :string
field :type, :string
field :role, :string
field :status, :string
field :fail_count, :integer
field :managed, :boolean

embeds_one :parent, ClusterResourceParent
end
end
21 changes: 21 additions & 0 deletions lib/trento/clusters/value_objects/cluster_resource_parent.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
defmodule Trento.Clusters.ValueObjects.ClusterResourceParent do
@moduledoc """
Represents the parent of a cluster resource

`managed` represents the maintenance state of the resource.
`multi_state` represents the type of the group:
- `true` means a Master/Slave group
- `false` means a Clone group
- `nil` means a standard Group
"""

@required_fields [:id]

use Trento.Support.Type

deftype do
field :id, :string
field :managed, :boolean
field :multi_state, :boolean
end
end
44 changes: 37 additions & 7 deletions lib/trento/discovery/policies/cluster_policy.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ defmodule Trento.Discovery.Policies.ClusterPolicy do

alias Trento.Discovery.Payloads.Cluster.ClusterDiscoveryPayload

alias Trento.Discovery.Payloads.Cluster.CrmmonDiscoveryPayload.{
CrmmonClone,
CrmmonGroup,
CrmmonResource
}

@uuid_namespace Application.compile_env!(:trento, :uuid_namespace)

# If hana_<sid>_glob_srmode or hana_<sid>_glob_op_mode attributes are not present
Expand Down Expand Up @@ -643,14 +649,15 @@ defmodule Trento.Discovery.Policies.ClusterPolicy do
_ ->
false
end)
|> Enum.map(fn %{id: id, agent: type, role: role} = resource ->
|> Enum.map(fn %{id: id, agent: type, role: role, parent: parent} = resource ->
%{
id: id,
type: type,
role: role,
status: parse_resource_status(resource),
fail_count: parse_fail_count(node_name, id, crmmon),
managed: parse_managed(resource)
managed: parse_managed(resource),
parent: parent
}
end)
end
Expand Down Expand Up @@ -793,11 +800,34 @@ defmodule Trento.Discovery.Policies.ClusterPolicy do
groups: groups,
clones: clones
}) do
Enum.concat(
resources,
Enum.flat_map(clones, &Map.get(&1, :resources, [])) ++
Enum.flat_map(groups, &Map.get(&1, :resources, []))
)
enriched_resources = enrich_parent(resources)
enriched_clones = enrich_parent(clones)
enriched_groups = enrich_parent(groups)

Enum.concat([enriched_resources, enriched_clones, enriched_groups])
end

defp enrich_parent(resource_group) do
Enum.flat_map(resource_group, fn
%CrmmonClone{id: id, managed: managed, multi_state: multi_state, resources: resources} ->
Enum.map(resources, fn resource ->
put_parent(resource, %{id: id, managed: managed, multi_state: multi_state})
end)

%CrmmonGroup{id: id, resources: resources} ->
Enum.map(resources, fn resource ->
put_parent(resource, %{id: id, managed: nil, multi_state: nil})
end)

%CrmmonResource{} = resource ->
[put_parent(resource, nil)]
end)
end

defp put_parent(resource, parent) do
resource
|> Map.from_struct()
|> Map.put(:parent, parent)
end

defp parse_resource_status(%{active: true}), do: "Active"
Expand Down
2 changes: 1 addition & 1 deletion lib/trento_web/controllers/v1/cluster_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ defmodule TrentoWeb.V1.ClusterJSON do
end

defp adapt_resources(resources) do
Enum.map(resources, &Map.drop(&1, [:managed]))
Enum.map(resources, &Map.drop(&1, [:managed, :parent]))
end
end
53 changes: 53 additions & 0 deletions lib/trento_web/controllers/v2/cluster_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ defmodule TrentoWeb.V2.ClusterJSON do
cluster
|> StructHelper.to_atomized_map()
|> Map.delete(:deregistered_at)
|> adapt_details()
end

def cluster_registered(%{cluster: cluster}), do: Map.delete(cluster(%{cluster: cluster}), :tags)
Expand All @@ -22,4 +23,56 @@ defmodule TrentoWeb.V2.ClusterJSON do

def cluster_health_changed(%{cluster: %{id: id, name: name, health: health}}),
do: %{cluster_id: id, name: name, health: health}

defp adapt_details(
%{
details: %{nodes: nodes, stopped_resources: stopped_resources} = details
} =
cluster
) do
adapted_nodes = Enum.map(nodes, &adapt_node/1)
adapted_stopped_resources = adapt_resources(stopped_resources)

adapted_details =
details
|> Map.put(:nodes, adapted_nodes)
|> Map.put(:stopped_resources, adapted_stopped_resources)

%{cluster | details: adapted_details}
end

defp adapt_details(
%{
details: %{sap_systems: nodes, stopped_resources: stopped_resources} = details
} =
cluster
) do
adapted_sap_systems = Enum.map(nodes, &adapt_sap_system/1)
adapted_stopped_resources = adapt_resources(stopped_resources)

adapted_details =
details
|> Map.put(:sap_systems, adapted_sap_systems)
|> Map.put(:stopped_resources, adapted_stopped_resources)

%{cluster | details: adapted_details}
end

defp adapt_details(cluster), do: cluster

defp adapt_sap_system(%{nodes: nodes} = sap_system) do
adapted_nodes = Enum.map(nodes, &adapt_node/1)

Map.put(sap_system, :nodes, adapted_nodes)
end

defp adapt_node(%{resources: resources} = node) do
adapted_resources = adapt_resources(resources)

Map.put(node, :resources, adapted_resources)
end

defp adapt_resources(resources) do
Enum.map(resources, &Map.drop(&1, [:parent]))
end
end
12 changes: 11 additions & 1 deletion test/support/factory.ex
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ defmodule Trento.Factory do
AscsErsClusterNode,
AscsErsClusterSapSystem,
ClusterResource,
ClusterResourceParent,
HanaClusterDetails,
HanaClusterNode,
HanaClusterSite,
Expand Down Expand Up @@ -645,7 +646,16 @@ defmodule Trento.Factory do
role: Faker.Beer.hop(),
status: Faker.Pokemon.name(),
fail_count: Enum.random(0..100),
managed: Enum.random([false, true])
managed: Enum.random([false, true]),
parent: build(:cluster_resource_parent)
}
end

def cluster_resource_parent_factory do
%ClusterResourceParent{
id: Faker.UUID.v4(),
managed: Enum.random([false, true]),
multi_state: Enum.random([false, true])
}
end

Expand Down
Loading
Loading