Files
houston/server/server.go

212 lines
4.2 KiB
Go
Raw Normal View History

2023-05-21 23:37:54 +09:00
package server
import (
2023-06-09 11:53:31 +09:00
"encoding/json"
2023-05-21 23:37:54 +09:00
"fmt"
"net"
2023-06-09 11:53:31 +09:00
"os"
"sync/atomic"
2023-05-21 23:37:54 +09:00
2023-06-14 00:13:51 +09:00
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/client"
2023-05-22 02:13:03 +09:00
"repositories.action2quare.com/ayo/houston/shared"
"repositories.action2quare.com/ayo/houston/shared/protos"
2023-05-21 23:37:54 +09:00
"google.golang.org/grpc"
)
// protoc --go_out=. --go-grpc_out=. protos/*.proto
type HoustonServer interface {
2023-06-09 11:53:31 +09:00
Start() error
2023-05-21 23:37:54 +09:00
Stop()
Operation() Operation
}
2023-06-09 11:53:31 +09:00
type serverConfig struct {
GrpcPort int `json:"grpc_port"`
2023-06-14 14:16:47 +09:00
StorageRoot string `json:"storage_path"`
RunAsClient bool `json:"run_as_client"`
2023-06-09 11:53:31 +09:00
}
2023-05-21 23:37:54 +09:00
type DeployRequest struct {
shared.DeployRequest
hostnames []string
}
func MakeDeployRequest(req shared.DeployRequest, targets []string) DeployRequest {
return DeployRequest{
DeployRequest: req,
hostnames: targets,
}
}
type WithdrawRequest struct {
shared.WithdrawRequest
hostnames []string
}
func MakeWithdrawRequest(req shared.WithdrawRequest, targets []string) WithdrawRequest {
return WithdrawRequest{
WithdrawRequest: req,
hostnames: targets,
}
}
type StartProcessRequest struct {
shared.StartProcessRequest
hostnames []string
}
func MakeStartProcessRequest(req shared.StartProcessRequest, targets []string) StartProcessRequest {
return StartProcessRequest{
StartProcessRequest: req,
hostnames: targets,
}
}
type StopProcessRequest struct {
shared.StopProcessRequest
hostnames []string
}
2023-05-22 15:40:01 +09:00
func MakeStopProcessRequest(req shared.StopProcessRequest, targets []string) StopProcessRequest {
2023-05-21 23:37:54 +09:00
return StopProcessRequest{
StopProcessRequest: req,
hostnames: targets,
}
}
type RestartProcessRequest struct {
shared.RestartProcessRequest
hostnames []string
}
func MakeRestartRequest(req shared.RestartProcessRequest, targets []string) RestartProcessRequest {
return RestartProcessRequest{
RestartProcessRequest: req,
hostnames: targets,
}
}
type UploadRequest struct {
shared.UploadRequest
hostnames []string
}
func MakeUploadRequest(req shared.UploadRequest, targets []string) UploadRequest {
return UploadRequest{
UploadRequest: req,
hostnames: targets,
}
}
type Operation interface {
Deploy(DeployRequest)
Withdraw(WithdrawRequest)
StartProcess(StartProcessRequest)
StopProcess(StopProcessRequest)
RestartProcess(RestartProcessRequest)
Upload(UploadRequest)
Hosts() map[string]hostSnapshot
}
2023-06-13 16:26:00 +09:00
func loadServerConfig() serverConfig {
configFile, err := os.Open("config.json")
if err != nil {
2023-06-14 00:13:51 +09:00
logger.Println(err)
2023-06-13 16:26:00 +09:00
return serverConfig{
GrpcPort: 8080,
}
}
defer configFile.Close()
2023-06-13 16:26:00 +09:00
var config struct {
Houston *struct {
Server serverConfig `json:"server"`
} `json:"houston"`
}
dec := json.NewDecoder(configFile)
err = dec.Decode(&config)
if err != nil {
2023-06-14 00:13:51 +09:00
logger.Println(err)
2023-06-13 16:26:00 +09:00
return serverConfig{
GrpcPort: 8080,
}
}
if config.Houston == nil {
2023-06-14 00:13:51 +09:00
logger.Println(`"houston" object is missing in config.json`)
2023-06-13 16:26:00 +09:00
return serverConfig{
GrpcPort: 8080,
}
2023-06-09 11:53:31 +09:00
}
2023-05-21 23:37:54 +09:00
2023-06-13 16:26:00 +09:00
return config.Houston.Server
}
func NewServer() HoustonServer {
2023-05-21 23:37:54 +09:00
var opts []grpc.ServerOption
grpcServer := grpc.NewServer(opts...)
os := newOperationServer()
ms := newMonitorServer()
protos.RegisterOperationServer(grpcServer, os)
protos.RegisterMonitorServer(grpcServer, ms)
return &houstonServer{
rpcServer: grpcServer,
os: os,
ms: ms,
2023-06-13 16:26:00 +09:00
port: loadServerConfig().GrpcPort,
2023-05-21 23:37:54 +09:00
}
}
type houstonServer struct {
rpcServer *grpc.Server
os *operationServer
ms *monitorServer
2023-06-09 11:53:31 +09:00
port int
2023-05-21 23:37:54 +09:00
}
2023-06-09 11:53:31 +09:00
func (hs *houstonServer) Start() error {
2023-06-14 00:13:51 +09:00
logger.Println("houston server is started at port", hs.port)
2023-06-09 11:53:31 +09:00
lis, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", hs.port))
2023-05-21 23:37:54 +09:00
if err != nil {
return err
}
closeCount := int32(0)
var hc client.HoustonClient
if loadServerConfig().RunAsClient {
2023-06-29 11:00:26 +09:00
hc, err = client.NewClient(false)
if err != nil {
return err
}
go func() {
hc.Start()
if atomic.AddInt32(&closeCount, 1) == 1 {
hs.Stop()
}
}()
}
err = hs.rpcServer.Serve(lis)
if atomic.AddInt32(&closeCount, 1) == 1 {
if hc != nil {
hc.Shutdown()
}
2023-05-21 23:37:54 +09:00
}
return err
2023-05-21 23:37:54 +09:00
}
func (hs *houstonServer) Stop() {
hs.rpcServer.GracefulStop()
}
func (hs *houstonServer) Operation() Operation {
return hs.os
}