mirror of
https://github.com/psviderski/uncloud.git
synced 2026-11-10 20:54:17 +00:00
fix(plan): make stop operation formatting consistent and do not count it as removal in summary
This commit is contained in:
@@ -83,8 +83,8 @@ func (p *Plan) formatSummary() string {
|
|||||||
machines[o.MachineID] = struct{}{}
|
machines[o.MachineID] = struct{}{}
|
||||||
removeCount++
|
removeCount++
|
||||||
case *operation.StopContainerOperation:
|
case *operation.StopContainerOperation:
|
||||||
|
// Stop operations aren't counted because a later operation in the plan removes the stopped container.
|
||||||
machines[o.MachineID] = struct{}{}
|
machines[o.MachineID] = struct{}{}
|
||||||
removeCount++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/charmbracelet/x/ansi"
|
"github.com/charmbracelet/x/ansi"
|
||||||
|
"github.com/psviderski/uncloud/pkg/api"
|
||||||
"github.com/psviderski/uncloud/pkg/client/deploy"
|
"github.com/psviderski/uncloud/pkg/client/deploy"
|
||||||
"github.com/psviderski/uncloud/pkg/client/operation"
|
"github.com/psviderski/uncloud/pkg/client/operation"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
@@ -28,3 +29,19 @@ func TestPlan_FormatSummary(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, "1 create · 2 update (in place) · 1 remove · across 3 machines", ansi.Strip(plan.formatSummary()))
|
assert.Equal(t, "1 create · 2 update (in place) · 1 remove · across 3 machines", ansi.Strip(plan.formatSummary()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPlan_FormatSummary_StopOperationsNotCounted(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
svc := &deploy.ServicePlan{}
|
||||||
|
svc.Operations = []operation.Operation{
|
||||||
|
&operation.StopContainerOperation{MachineID: "m-1"},
|
||||||
|
&operation.StopContainerOperation{MachineID: "m-1"},
|
||||||
|
&operation.ReplaceContainerOperation{MachineID: "m-1", Order: api.UpdateOrderStopFirst},
|
||||||
|
&operation.RemoveContainerOperation{MachineID: "m-1"},
|
||||||
|
}
|
||||||
|
plan := &Plan{Services: []*deploy.ServicePlan{svc}}
|
||||||
|
|
||||||
|
// Stop operations aren't counted because a later operation in the plan removes the stopped container.
|
||||||
|
assert.Equal(t, "1 replace (stop-first) · 1 remove · across 1 machine", ansi.Strip(plan.formatSummary()))
|
||||||
|
}
|
||||||
|
|||||||
@@ -195,8 +195,8 @@ func (sp *ServicePlan) FormatSummary() string {
|
|||||||
machines[o.MachineID] = struct{}{}
|
machines[o.MachineID] = struct{}{}
|
||||||
removeCount++
|
removeCount++
|
||||||
case *operation.StopContainerOperation:
|
case *operation.StopContainerOperation:
|
||||||
|
// Stop operations aren't counted because a later operation in the plan removes the stopped container.
|
||||||
machines[o.MachineID] = struct{}{}
|
machines[o.MachineID] = struct{}{}
|
||||||
removeCount++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,16 @@ func TestServicePlan_FormatSummary(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expected: "2 update (in place) · across 2 machines",
|
expected: "2 update (in place) · across 2 machines",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "stop operations not counted as they are followed by remove",
|
||||||
|
ops: []operation.Operation{
|
||||||
|
&operation.StopContainerOperation{MachineID: "m-1"},
|
||||||
|
&operation.StopContainerOperation{MachineID: "m-1"},
|
||||||
|
&operation.ReplaceContainerOperation{MachineID: "m-1", Order: api.UpdateOrderStopFirst},
|
||||||
|
&operation.RemoveContainerOperation{MachineID: "m-1"},
|
||||||
|
},
|
||||||
|
expected: "1 replace (stop-first) · 1 remove · across 1 machine",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "all operation types",
|
name: "all operation types",
|
||||||
ops: []operation.Operation{
|
ops: []operation.Operation{
|
||||||
|
|||||||
@@ -386,6 +386,7 @@ func reconcileGlobalContainer(
|
|||||||
if err != nil || len(conflictingPorts) > 0 {
|
if err != nil || len(conflictingPorts) > 0 {
|
||||||
ops = append(ops, &operation.StopContainerOperation{
|
ops = append(ops, &operation.StopContainerOperation{
|
||||||
ServiceID: serviceID,
|
ServiceID: serviceID,
|
||||||
|
ServiceName: c.Container.ServiceSpec.Name,
|
||||||
ContainerID: c.Container.ID,
|
ContainerID: c.Container.ID,
|
||||||
MachineID: machine.Id,
|
MachineID: machine.Id,
|
||||||
MachineName: machine.Name,
|
MachineName: machine.Name,
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ func TestReconcileGlobalContainer(t *testing.T) {
|
|||||||
expectedOps: []operation.Operation{
|
expectedOps: []operation.Operation{
|
||||||
&operation.StopContainerOperation{
|
&operation.StopContainerOperation{
|
||||||
ServiceID: "service-1",
|
ServiceID: "service-1",
|
||||||
|
ServiceName: container2WithPort9090.ServiceSpec.Name,
|
||||||
ContainerID: "container-2",
|
ContainerID: "container-2",
|
||||||
MachineID: "machine-1",
|
MachineID: "machine-1",
|
||||||
MachineName: "machine-1",
|
MachineName: "machine-1",
|
||||||
|
|||||||
@@ -82,7 +82,9 @@ func (o *RunContainerOperation) String() string {
|
|||||||
|
|
||||||
// StopContainerOperation stops a container on a specific machine.
|
// StopContainerOperation stops a container on a specific machine.
|
||||||
type StopContainerOperation struct {
|
type StopContainerOperation struct {
|
||||||
ServiceID string
|
ServiceID string
|
||||||
|
// ServiceName is used for formatting the operation as part of the deployment plan.
|
||||||
|
ServiceName string
|
||||||
ContainerID string
|
ContainerID string
|
||||||
MachineID string
|
MachineID string
|
||||||
// MachineName is used for formatting the operation as part of the deployment plan.
|
// MachineName is used for formatting the operation as part of the deployment plan.
|
||||||
@@ -98,8 +100,7 @@ func (o *StopContainerOperation) Execute(ctx context.Context, cli Client) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (o *StopContainerOperation) Format() string {
|
func (o *StopContainerOperation) Format() string {
|
||||||
// TODO: pass service name to format the display name consistently with other operations.
|
displayName := o.ServiceName + tui.Faint.Render("/") + stringid.TruncateID(o.ContainerID)
|
||||||
displayName := stringid.TruncateID(o.ContainerID)
|
|
||||||
|
|
||||||
return tui.BoldRed.Render("-") + " " +
|
return tui.BoldRed.Render("-") + " " +
|
||||||
tui.Faint.Render("stop container") + " " +
|
tui.Faint.Render("stop container") + " " +
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/charmbracelet/x/ansi"
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/docker/api/types/volume"
|
"github.com/docker/docker/api/types/volume"
|
||||||
"github.com/psviderski/uncloud/pkg/api"
|
"github.com/psviderski/uncloud/pkg/api"
|
||||||
@@ -12,6 +13,18 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestStopContainerOperation_Format(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
op := &StopContainerOperation{
|
||||||
|
ServiceName: "app",
|
||||||
|
ContainerID: "0f6df6593e1b0123456789abcdef",
|
||||||
|
MachineName: "machine-1",
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, "- stop container app/0f6df6593e1b on machine-1", ansi.Strip(op.Format()))
|
||||||
|
}
|
||||||
|
|
||||||
func TestReplaceContainerOperation_StopFirstPreparation(t *testing.T) {
|
func TestReplaceContainerOperation_StopFirstPreparation(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user