mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 11:03:34 +00:00
feat: introduce client.Service entity for managing service containers
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user