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

Managed Deployments: Groups and Releases #1653

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
2 changes: 1 addition & 1 deletion .dialyzer_ignore.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[
{"lib/x509/certificate.ex", "Unknown type: X509.ASN1.record/1."},
{"lib/x509/certificate/extension.ex", "Unknown type: X509.ASN1.record/1."},
{"lib/nerves_hub/deployments/orchestrator.ex", :unmatched_return, 1},
{"lib/nerves_hub/managed_deployments/orchestrator.ex", :unmatched_return, 1},
{"lib/nerves_hub_web/channels/device_channel.ex", :unmatched_return, 1},
{"lib/nerves_hub_web/channels/device_socket.ex", :unmatched_return, 1}
]
4 changes: 2 additions & 2 deletions assets/css/_custom.scss
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@
line-height: 44px;
}

.deployment-meta-grid {
.deployment-group-meta-grid {
display: grid;
grid-template-columns: max-content max-content max-content max-content 1fr;
grid-column-gap: 5.5rem;
Expand Down Expand Up @@ -397,7 +397,7 @@ html {
}

@media (max-width: 1000px) and (min-width: 480px) {
.collapse.deployment-form.show {
.collapse.deployment-group-form.show {
display: grid !important;
}
}
Expand Down
2 changes: 1 addition & 1 deletion assets/css/_layout.scss
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ html {
grid-column-gap: 2rem;
grid-row-gap: 2rem;

&.deployment-form {
&.deployment-group-form {
grid-template-columns: 360px 360px;
grid-row-gap: 0;
grid-column-gap: 3rem;
Expand Down
6 changes: 3 additions & 3 deletions assets/css/_table.scss
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ html {
gap: 6px;
}

.deployment-state {
.deployment-group-state {
background-size: 1.5rem;
background-repeat: no-repeat;
background-position: left center;
Expand All @@ -128,10 +128,10 @@ html {
}

.certificate-status-expired {
color: var(--danger);;
color: var(--danger);
}

.certificate-status-expiring-soon {
color: var(--warning);
}
}
}
4 changes: 2 additions & 2 deletions lib/nerves_hub/accounts/remove_account.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ defmodule NervesHub.Accounts.RemoveAccount do
alias NervesHub.Accounts.OrgMetric
alias NervesHub.Accounts.OrgUser
alias NervesHub.Accounts.User
alias NervesHub.Deployments.Deployment
alias NervesHub.Devices.CACertificate
alias NervesHub.Devices.Device
alias NervesHub.Devices.DeviceCertificate
alias NervesHub.Firmwares
alias NervesHub.Firmwares.Firmware
alias NervesHub.Firmwares.FirmwareDelta
alias NervesHub.Firmwares.FirmwareTransfer
alias NervesHub.ManagedDeployments.DeploymentGroup
alias NervesHub.Products.Product
alias NervesHub.Scripts.Script

Expand All @@ -32,7 +32,7 @@ defmodule NervesHub.Accounts.RemoveAccount do
|> Multi.delete_all(:invites, &query_by_org_id(Invite, &1))
|> Multi.delete_all(:device_certificates, &query_by_org_id(DeviceCertificate, &1))
|> Multi.delete_all(:ca_certificates, &query_by_org_id(CACertificate, &1))
|> Multi.delete_all(:deployments, &query_by_org_id(Deployment, &1))
|> Multi.delete_all(:deployment_groups, &query_by_org_id(DeploymentGroup, &1))
|> Multi.delete_all(:firmware_deltas, &query_firmware_deltas/1)
|> Multi.delete_all(:firmware_transfers, &query_by_org_id(FirmwareTransfer, &1))
|> Multi.delete_all(:pinned_devices, &query_by_user_id(PinnedDevice, &1))
Expand Down
6 changes: 3 additions & 3 deletions lib/nerves_hub/application.ex
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,13 @@ defmodule NervesHub.Application do
defp deployments_orchestrator(_) do
case Application.get_env(:nerves_hub, :app) do
["device"] ->
[NervesHub.Deployments.Supervisor]
[NervesHub.ManagedDeployments.Supervisor]

_ ->
[
NervesHub.Deployments.Supervisor,
NervesHub.ManagedDeployments.Supervisor,
ProcessHub.child_spec(%ProcessHub{hub_id: :deployment_orchestrators}),
NervesHub.Deployments.Distributed.OrchestratorRegistration
NervesHub.ManagedDeployments.Distributed.OrchestratorRegistration
]
end
end
Expand Down
10 changes: 5 additions & 5 deletions lib/nerves_hub/archives.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ defmodule NervesHub.Archives do
require Logger

alias NervesHub.Archives.Archive
alias NervesHub.Deployments.Deployment
alias NervesHub.Fwup
alias NervesHub.ManagedDeployments.DeploymentGroup
alias NervesHub.Products.Product
alias NervesHub.Repo
alias NervesHub.Workers.DeleteArchive
Expand Down Expand Up @@ -67,12 +67,12 @@ defmodule NervesHub.Archives do
|> Repo.one!()
end

@spec archive_for_deployment(integer()) :: Archive.t() | nil
def archive_for_deployment(nil), do: nil
@spec archive_for_deployment_group(integer()) :: Archive.t() | nil
def archive_for_deployment_group(nil), do: nil

def archive_for_deployment(deployment_id) do
def archive_for_deployment_group(deployment_id) do
Archive
|> join(:inner, [a], d in Deployment, on: d.archive_id == a.id)
|> join(:inner, [a], d in DeploymentGroup, on: d.archive_id == a.id)
|> where([a, d], d.id == ^deployment_id)
|> Repo.one()
end
Expand Down
6 changes: 3 additions & 3 deletions lib/nerves_hub/audit_logs.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ defmodule NervesHub.AuditLogs do
import Ecto.Query

alias NervesHub.AuditLogs.AuditLog
alias NervesHub.Deployments.Deployment
alias NervesHub.ManagedDeployments.DeploymentGroup
alias NervesHub.Repo
alias NimbleCSV.RFC4180, as: CSV

Expand Down Expand Up @@ -60,8 +60,8 @@ defmodule NervesHub.AuditLogs do
|> Flop.run(flop)
end

defp query_for_feed(%Deployment{id: id}) do
resource_type = to_string(Deployment)
defp query_for_feed(%DeploymentGroup{id: id}) do
resource_type = to_string(DeploymentGroup)

from(al in AuditLog, where: [resource_type: ^resource_type, resource_id: ^id])
|> order_by(desc: :inserted_at)
Expand Down
47 changes: 47 additions & 0 deletions lib/nerves_hub/audit_logs/templates/deployment_group_templates.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
defmodule NervesHub.AuditLogs.DeploymentGroupTemplates do
@moduledoc """
Templates for and handling of audit logging for deployment operations.
"""
alias NervesHub.Accounts.User
alias NervesHub.AuditLogs
alias NervesHub.Devices.Device
alias NervesHub.ManagedDeployments.DeploymentGroup

@spec audit_deployment_created(User.t(), DeploymentGroup.t()) :: :ok
def audit_deployment_created(user, deployment_group) do
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These function names should change, but they shouldn't just have _group added to them. I want to make a more wholistic change to device template that removes the resource name from the function names, e.g. DeploymentGroupTemplates.audit_created. We'll save that work for later.

description = "User #{user.name} created deployment group #{deployment_group.name}"
AuditLogs.audit!(user, deployment_group, description)
end

@spec audit_deployment_updated(User.t(), DeploymentGroup.t()) :: :ok
def audit_deployment_updated(user, deployment_group) do
description = "User #{user.name} updated deployment group #{deployment_group.name}"
AuditLogs.audit!(user, deployment_group, description)
end

@spec audit_deployment_deleted(User.t(), DeploymentGroup.t()) :: :ok
def audit_deployment_deleted(user, deployment_group) do
description = "User #{user.name} deleted deployment group #{deployment_group.name}"
AuditLogs.audit!(user, deployment_group, description)
end

@spec audit_deployment_toggle_active(User.t(), DeploymentGroup.t(), String.t()) :: :ok
def audit_deployment_toggle_active(user, deployment_group, status) do
description = "User #{user.name} marked deployment group #{deployment_group.name} #{status}"
AuditLogs.audit!(user, deployment_group, description)
end

@spec audit_deployment_mismatch(Device.t(), DeploymentGroup.t(), String.t()) :: :ok
def audit_deployment_mismatch(device, deployment_group, reason) do
description =
"Device no longer matches deployment group #{deployment_group.name}'s requirements because of #{reason}"

AuditLogs.audit!(device, deployment_group, description)
end

@spec audit_deployment_group_change(DeploymentGroup.t(), String.t()) :: :ok
def audit_deployment_group_change(deployment_group, change_string) do
description = "Deployment group #{deployment_group.name} #{change_string}"
AuditLogs.audit!(deployment_group, deployment_group, description)
end
end
47 changes: 0 additions & 47 deletions lib/nerves_hub/audit_logs/templates/deployment_templates.ex

This file was deleted.

48 changes: 26 additions & 22 deletions lib/nerves_hub/audit_logs/templates/device_templates.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ defmodule NervesHub.AuditLogs.DeviceTemplates do
alias NervesHub.Accounts.User
alias NervesHub.Archives.Archive
alias NervesHub.AuditLogs
alias NervesHub.Deployments.Deployment
alias NervesHub.Devices.Device
alias NervesHub.Firmwares.Firmware
alias NervesHub.ManagedDeployments.DeploymentGroup

require Logger

Expand All @@ -34,10 +34,10 @@ defmodule NervesHub.AuditLogs.DeviceTemplates do
AuditLogs.audit(device, device, description)
end

@spec audit_pushed_available_update(User.t(), Device.t(), Deployment.t()) :: :ok
def audit_pushed_available_update(user, device, deployment) do
@spec audit_pushed_available_update(User.t(), Device.t(), DeploymentGroup.t()) :: :ok
def audit_pushed_available_update(user, device, deployment_group) do
description =
"User #{user.name} pushed available firmware update #{deployment.firmware.version} #{deployment.firmware.uuid} to device #{device.identifier}"
"User #{user.name} pushed available firmware update #{deployment_group.firmware.version} #{deployment_group.firmware.uuid} to device #{device.identifier}"

AuditLogs.audit!(user, device, description)
end
Expand All @@ -56,14 +56,14 @@ defmodule NervesHub.AuditLogs.DeviceTemplates do
AuditLogs.audit!(device, device, description)
end

@spec audit_firmware_upgrade_blocked(Deployment.t(), Device.t()) :: :ok
def audit_firmware_upgrade_blocked(deployment, device) do
@spec audit_firmware_upgrade_blocked(DeploymentGroup.t(), Device.t()) :: :ok
def audit_firmware_upgrade_blocked(deployment_group, device) do
description = """
Device #{device.identifier} automatically blocked firmware upgrades for #{deployment.penalty_timeout_minutes} minutes.
Device failure rate met for firmware #{deployment.firmware.uuid} in deployment #{deployment.name}.
Device #{device.identifier} automatically blocked firmware upgrades for #{deployment_group.penalty_timeout_minutes} minutes.
Device failure rate met for firmware #{deployment_group.firmware.uuid} in deployment group #{deployment_group.name}.
"""

AuditLogs.audit!(deployment, device, description)
AuditLogs.audit!(deployment_group, device, description)
end

@spec audit_firmware_updated(Device.t()) :: :ok
Expand All @@ -74,39 +74,43 @@ defmodule NervesHub.AuditLogs.DeviceTemplates do
AuditLogs.audit!(device, device, description)
end

@spec audit_device_deployment_update_triggered(Device.t(), Deployment.t(), UUIDv7.t()) :: :ok
def audit_device_deployment_update_triggered(device, deployment, reference_id) do
firmware = deployment.firmware
@spec audit_device_deployment_group_update_triggered(
Device.t(),
DeploymentGroup.t(),
UUIDv7.t()
) :: :ok
def audit_device_deployment_group_update_triggered(device, deployment_group, reference_id) do
firmware = deployment_group.firmware

description =
"Deployment #{deployment.name} update triggered device #{device.identifier} to update firmware #{firmware.uuid}"
"Deployment #{deployment_group.name} update triggered device #{device.identifier} to update firmware #{firmware.uuid}"

AuditLogs.audit_with_ref!(deployment, device, description, reference_id)
AuditLogs.audit_with_ref!(deployment_group, device, description, reference_id)
end

@spec audit_device_deployment_update(User.t(), Device.t(), Deployment.t()) :: :ok
def audit_device_deployment_update(user, device, deployment) do
@spec audit_device_deployment_group_update(User.t(), Device.t(), DeploymentGroup.t()) :: :ok
def audit_device_deployment_group_update(user, device, deployment_group) do
AuditLogs.audit!(
user,
device,
"User #{user.name} set #{device.identifier}'s deployment to #{deployment.name}"
"User #{user.name} set #{device.identifier}'s deployment group to #{deployment_group.name}"
)
end

@spec audit_set_deployment(Device.t(), Deployment.t(), :one_found | :multiple_found) :: :ok
def audit_set_deployment(device, deployment, :one_found) do
@spec audit_set_deployment(Device.t(), DeploymentGroup.t(), :one_found | :multiple_found) :: :ok
def audit_set_deployment(device, deployment_group, :one_found) do
AuditLogs.audit!(
device,
device,
"Updating #{device.identifier}'s deployment to #{deployment.name}"
"Updating #{device.identifier}'s deployment group to #{deployment_group.name}"
)
end

def audit_set_deployment(device, deployment, :multiple_found) do
def audit_set_deployment(device, deployment_group, :multiple_found) do
AuditLogs.audit!(
device,
device,
"Multiple matching deployments found, updating #{device.identifier}'s deployment to #{deployment.name}"
"Multiple matching deployments found, updating #{device.identifier}'s deployment group to #{deployment_group.name}"
)
end

Expand Down
15 changes: 0 additions & 15 deletions lib/nerves_hub/deployments/inflight_deployment_check.ex

This file was deleted.

Loading
Loading