feat: introduce client.Service entity for managing service containers

This commit is contained in:
Pavel Sviderski
2025-02-10 20:21:42 +10:00
parent c0bf1f2930
commit 04fd1b1425
3 changed files with 52 additions and 0 deletions
+1
View File
@@ -10,6 +10,7 @@ func NewRootCommand() *cobra.Command {
Short: "Manage services in an Uncloud cluster.", Short: "Manage services in an Uncloud cluster.",
} }
cmd.AddCommand( cmd.AddCommand(
NewInspectCommand(),
NewListCommand(), NewListCommand(),
NewRmCommand(), NewRmCommand(),
NewRunCommand(), NewRunCommand(),
+29
View File
@@ -36,6 +36,35 @@ type MachineContainerID struct {
ContainerID string ContainerID string
} }
type Service struct {
ID string
Name string
}
// NewService creates a new Service object with the specified name that can be used to run service containers.
// It doesn't create anything in the cluster yet.
func (cli *Client) NewService(ctx context.Context, name string) (*Service, error) {
// Optimistically check if a service with the specified name already exists.
// TODO: introduce a distributed lock to hold for all service related operations.
_, err := cli.InspectService(ctx, name)
if err == nil {
return nil, fmt.Errorf("service with name '%s' already exists", name)
}
if !errors.Is(err, ErrNotFound) {
return nil, fmt.Errorf("inspect service: %w", err)
}
id, err := secret.NewID()
if err != nil {
return nil, fmt.Errorf("generate service ID: %w", err)
}
return &Service{
ID: id,
Name: name,
}, nil
}
func (cli *Client) RunService(ctx context.Context, spec api.ServiceSpec) (RunServiceResponse, error) { func (cli *Client) RunService(ctx context.Context, spec api.ServiceSpec) (RunServiceResponse, error) {
var resp RunServiceResponse var resp RunServiceResponse
+22
View File
@@ -11,6 +11,28 @@ import (
"uncloud/internal/ucind" "uncloud/internal/ucind"
) )
func TestService(t *testing.T) {
t.Parallel()
clusterName := "ucind-test.service"
ctx := context.Background()
c, _ := createTestCluster(t, clusterName, ucind.CreateClusterOptions{Machines: 1}, true)
cli, err := c.Machines[0].Connect(ctx)
require.NoError(t, err)
t.Run("container lifecycle", func(t *testing.T) {
t.Parallel()
name := "busybox-container-lifecycle"
svc, err := cli.NewService(ctx, name)
require.NoError(t, err)
assert.NotEmpty(t, svc.ID)
assert.Equal(t, name, svc.Name)
})
}
func TestRunService(t *testing.T) { func TestRunService(t *testing.T) {
t.Parallel() t.Parallel()