144 lines
2.8 KiB
Go
144 lines
2.8 KiB
Go
|
|
package server
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"houston/shared"
|
||
|
|
"houston/shared/protos"
|
||
|
|
"net"
|
||
|
|
|
||
|
|
"google.golang.org/grpc"
|
||
|
|
)
|
||
|
|
|
||
|
|
// protoc --go_out=. --go-grpc_out=. protos/*.proto
|
||
|
|
type HoustonServer interface {
|
||
|
|
Start(port int) error
|
||
|
|
Stop()
|
||
|
|
Operation() Operation
|
||
|
|
}
|
||
|
|
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
func MakeStopRequest(req shared.StopProcessRequest, targets []string) StopProcessRequest {
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewServer() HoustonServer {
|
||
|
|
|
||
|
|
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,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
type houstonServer struct {
|
||
|
|
rpcServer *grpc.Server
|
||
|
|
os *operationServer
|
||
|
|
ms *monitorServer
|
||
|
|
}
|
||
|
|
|
||
|
|
func (hs *houstonServer) Start(port int) error {
|
||
|
|
lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", port))
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := hs.rpcServer.Serve(lis); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (hs *houstonServer) Stop() {
|
||
|
|
hs.rpcServer.GracefulStop()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (hs *houstonServer) Operation() Operation {
|
||
|
|
return hs.os
|
||
|
|
}
|