refactor: change structure project

This commit is contained in:
lorsan
2026-05-03 19:17:55 +03:00
parent e289365ce8
commit c44fedb488
38 changed files with 62 additions and 59 deletions
@@ -0,0 +1,60 @@
package agent_service
import (
"context"
"fmt"
"github.com/lorsanstand/HomeOps-Hub/agent/internal/utils/config_yaml"
"github.com/lorsanstand/HomeOps-Hub/agent/internal/utils/settings"
"github.com/lorsanstand/HomeOps-Hub/shared/domain"
"github.com/rs/zerolog"
)
const AgentVersion = "0.0"
type Collector interface {
GatherInfoSystem() (domain.HostInfo, []domain.Capability)
}
type HubConnection interface {
RegisterAgent(ctx context.Context, RegisterData domain.RegisterAgentRequest) (domain.RegisterAgentResponse, error)
}
type AgentService struct {
collect Collector
conn HubConnection
log zerolog.Logger
cfg *config_yaml.AgentConfig
heartBeat int
settings *settings.Settings
}
func NewAgentService(
collector Collector,
conn HubConnection,
settings *settings.Settings,
cfg *config_yaml.AgentConfig,
logger zerolog.Logger,
) *AgentService {
logger = logger.With().Str("component", "cmd.service.agent_serivce").Logger()
return &AgentService{collect: collector, conn: conn, cfg: cfg, log: logger, settings: settings}
}
func (a *AgentService) RegisterAgentConn(ctx context.Context) {
info, caps := a.collect.GatherInfoSystem()
AgentID := a.settings.AgentID
AgentName := a.cfg.AppName
AgentData := domain.RegisterAgentRequest{AgentId: AgentID, AgentName: AgentName, Host: info, Capabilities: caps, AgentVersion: AgentVersion}
data, err := a.conn.RegisterAgent(ctx, AgentData)
if err != nil {
a.log.Error().Err(err).Msg("failed register cmd")
return
}
if err = a.settings.Insert(settings.Settings{AgentID: data.AgentID}); err != nil {
a.log.Warn().Err(err).Msg("failed to save cmd id")
}
fmt.Println(data)
}
@@ -0,0 +1,25 @@
package agent_service
import (
"context"
"github.com/lorsanstand/HomeOps-Hub/shared/domain"
)
type CollectorMock struct {
host domain.HostInfo
caps []domain.Capability
}
func (c *CollectorMock) GatherInfoSystem() (domain.HostInfo, []domain.Capability) {
return c.host, c.caps
}
type ConnectionMock struct {
regAgentErr error
regResp domain.RegisterAgentResponse
}
func (c *ConnectionMock) RegisterAgent(ctx context.Context, RegisterData domain.RegisterAgentRequest) (domain.RegisterAgentResponse, error) {
return c.regResp, c.regAgentErr
}
@@ -0,0 +1,40 @@
package collector
import (
"os"
"runtime"
"github.com/lorsanstand/HomeOps-Hub/shared/domain"
"github.com/rs/zerolog"
)
type Docker interface {
Capability() domain.Capability
}
type Collector struct {
log zerolog.Logger
dockerReader Docker
}
func NewCollector(docker Docker, logger zerolog.Logger) *Collector {
logger = logger.With().Str("component", "cmd.service.collector").Logger()
return &Collector{log: logger, dockerReader: docker}
}
func (c *Collector) GatherInfoSystem() (domain.HostInfo, []domain.Capability) {
var host domain.HostInfo
hostname, err := os.Hostname()
if err != nil {
c.log.Warn().Msg("failed to get hostname")
}
host.Hostname = hostname
host.Arch = runtime.GOARCH
host.System = runtime.GOOS
caps := []domain.Capability{c.dockerReader.Capability()}
return host, caps
}
@@ -0,0 +1,22 @@
package docker_service
import (
"github.com/lorsanstand/HomeOps-Hub/shared/domain"
)
type BadDocker struct {
reason string
}
func (d *BadDocker) Capability() domain.Capability {
return domain.Capability{
Name: "docker",
Available: false,
Version: "",
Reason: d.reason,
}
}
func NewBadDocker(reason string) *BadDocker {
return &BadDocker{reason: reason}
}
@@ -0,0 +1,49 @@
package docker_service
import (
"context"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/lorsanstand/HomeOps-Hub/shared/domain"
"github.com/rs/zerolog"
)
type dockerAPI interface {
Ping(ctx context.Context) (types.Ping, error)
ContainerList(ctx context.Context, opts container.ListOptions) ([]container.Summary, error)
}
type DockerService struct {
dockerClient dockerAPI
log zerolog.Logger
}
func NewDockerService(api dockerAPI, logger zerolog.Logger) *DockerService {
return &DockerService{
dockerClient: api,
log: logger.With().Str("component", "cmd.serivce.docker").Logger(),
}
}
func (d *DockerService) CheckDockerDaemon(ctx context.Context) error {
_, err := d.dockerClient.Ping(ctx)
d.log.Debug().Msg("check docker")
return err
}
func (d *DockerService) ContainersList(ctx context.Context) ([]container.Summary, error) {
ContainersList, err := d.dockerClient.ContainerList(ctx, container.ListOptions{})
d.log.Debug().Msg("get container list")
return ContainersList, err
}
func (d *DockerService) Capability() domain.Capability {
return domain.Capability{
Available: true,
Version: "0",
Name: "docker",
Reason: "",
}
}
@@ -0,0 +1,135 @@
package docker_service
import (
"context"
"errors"
"testing"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/rs/zerolog"
)
var testError error = errors.New("test")
type DockerMock struct {
pingErr error
containers []container.Summary
containerErr error
}
func (d DockerMock) Ping(ctx context.Context) (types.Ping, error) {
return types.Ping{}, d.pingErr
}
func (d DockerMock) ContainerList(ctx context.Context, _ container.ListOptions) ([]container.Summary, error) {
return d.containers, d.containerErr
}
func TestCheckDockerDaemon(t *testing.T) {
t.Parallel()
tests := []struct {
name string
mock DockerMock
wantErr error
}{
{
name: "success",
mock: DockerMock{
pingErr: nil,
containers: nil,
containerErr: nil,
},
wantErr: nil,
},
{
name: "docker error",
mock: DockerMock{
pingErr: testError,
containers: nil,
containerErr: nil,
},
wantErr: testError,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
svc := NewDockerService(tt.mock, zerolog.Logger{})
err := svc.CheckDockerDaemon(context.Background())
if !errors.Is(err, tt.wantErr) {
t.Fatalf("expected error %v, got: %v", tt.wantErr, err)
}
})
}
}
func TestContainersList(t *testing.T) {
t.Parallel()
containers := []container.Summary{
{ID: "123", Image: "postgres:latest"},
{ID: "456", Image: "nginx:latest"},
}
tests := []struct {
name string
mock DockerMock
wantLen int
wantErr error
}{
{
name: "success",
mock: DockerMock{
pingErr: nil,
containers: containers,
containerErr: nil,
},
wantLen: len(containers),
wantErr: nil,
},
{
name: "docker error",
mock: DockerMock{
pingErr: nil,
containers: nil,
containerErr: testError,
},
wantLen: 0,
wantErr: testError,
},
{
name: "docker empty container",
mock: DockerMock{
pingErr: nil,
containers: nil,
containerErr: nil,
},
wantLen: 0,
wantErr: nil,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
svc := NewDockerService(tt.mock, zerolog.Logger{})
got, err := svc.ContainersList(context.Background())
if !errors.Is(err, tt.wantErr) {
t.Fatalf("expected error %v, got: %v", tt.wantErr, err)
}
if tt.wantLen != len(got) {
t.Fatalf("expected %d containers, got: %d", tt.wantLen, len(got))
}
})
}
}