-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
commit server,agents,clients, AMP Bootstrap and fixes reports (#519)
* add bootstrap feature to AMP cluster CLI (#306) * update vendors (huge diff)
- Loading branch information
1 parent
cd528ec
commit fc727f7
Showing
210 changed files
with
11,309 additions
and
1,919 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,7 @@ | |
/amplifier-gateway | ||
/amp-agent | ||
/amp-log-worker | ||
/amp-cluster | ||
/dist | ||
/*.exe | ||
coverage.out | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
package agentcore | ||
|
||
import ( | ||
"fmt" | ||
"math/rand" | ||
"net" | ||
"os" | ||
"os/signal" | ||
"syscall" | ||
"time" | ||
|
||
"github.com/appcelerator/amp/cmd/adm-agent/agentgrpc" | ||
"github.com/appcelerator/amp/cmd/adm-server/servergrpc" | ||
//"github.com/docker/docker/api/types" | ||
"github.com/docker/docker/client" | ||
"golang.org/x/net/context" | ||
"google.golang.org/grpc" | ||
"google.golang.org/grpc/metadata" | ||
) | ||
|
||
// ClusterAgent struct | ||
type ClusterAgent struct { | ||
id string | ||
realID string | ||
nodeID string | ||
hostname string | ||
address string | ||
dockerClient *client.Client | ||
client servergrpc.ClusterServerServiceClient | ||
conn *grpc.ClientConn | ||
token string | ||
ctx context.Context | ||
healthy bool | ||
} | ||
|
||
//Init Connect to docker engine, get initial containers list and start the agent | ||
func (g *ClusterAgent) Init(version string, build string) error { | ||
g.setToken() | ||
g.ctx = context.Background() | ||
g.trapSignal() | ||
conf.init(version, build) | ||
g.id = os.Getenv("HOSTNAME") | ||
|
||
// Connection to Docker | ||
defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"} | ||
cli, err := client.NewClient(conf.dockerEngine, "v1.24", nil, defaultHeaders) | ||
if err != nil { | ||
return err | ||
} | ||
g.dockerClient = cli | ||
fmt.Println("Connected to Docker-engine") | ||
g.inspectContainer() | ||
//start GRPC | ||
g.startGRPCServer() | ||
// Connection to server | ||
if err := g.connectServer(); err != nil { | ||
return err | ||
} | ||
fmt.Println("Connected to adm-server") | ||
g.startHeartBeat() | ||
return nil | ||
} | ||
|
||
func (g *ClusterAgent) connectServer() error { | ||
conn, err := grpc.Dial(fmt.Sprintf("%s:%s", conf.serverAddr, conf.serverPort), | ||
grpc.WithInsecure(), | ||
grpc.WithBlock(), | ||
grpc.WithTimeout(time.Second*20)) | ||
if err != nil { | ||
return err | ||
} | ||
g.conn = conn | ||
g.client = servergrpc.NewClusterServerServiceClient(conn) | ||
logf.info("Connected to server\n") | ||
ctx := metadata.NewContext(context.Background(), metadata.Pairs("token", g.token)) | ||
_, errReg := g.client.RegisterAgent(ctx, &servergrpc.RegisterRequest{ | ||
Id: g.id, | ||
NodeId: g.nodeID, | ||
Hostname: g.hostname, | ||
Address: g.address, | ||
}) | ||
if errReg != nil { | ||
return fmt.Errorf("Register on server error: %v", errReg) | ||
} | ||
logf.info("Agent registered\n") | ||
g.healthy = true | ||
return nil | ||
} | ||
|
||
func (g *ClusterAgent) startGRPCServer() { | ||
serv := grpc.NewServer() | ||
agentgrpc.RegisterClusterAgentServiceServer(serv, g) | ||
logf.info("Starting GRPC server\n") | ||
lis, err := net.Listen("tcp", ":"+conf.grpcPort) | ||
if err != nil { | ||
logf.error("adm-agent is unable to listen on: %s\n%v", ":"+conf.grpcPort, err) | ||
return | ||
} | ||
go func() { | ||
logf.info("adm-agent is listening on port %s\n", conf.grpcPort) | ||
if err := serv.Serve(lis); err != nil { | ||
logf.error("Problem in adm-agent: %s\n", err) | ||
return | ||
} | ||
}() | ||
time.Sleep(2 * time.Second) | ||
} | ||
|
||
func (g *ClusterAgent) inspectContainer() { | ||
inspect, err := g.dockerClient.ContainerInspect(g.ctx, g.id) | ||
if err != nil { | ||
logf.error("Error inspecting container: %v\n", err) | ||
return | ||
} | ||
g.realID = inspect.ID | ||
g.nodeID = inspect.Config.Labels["com.docker.swarm.node.id"] | ||
g.address = fmt.Sprintf("%s:%s", inspect.NetworkSettings.Networks["amp-infra"].IPAddress, conf.grpcPort) | ||
logf.debug("Agent: id=%s, address=%s nodeId=%s\n", g.id, g.address, g.nodeID) | ||
} | ||
|
||
func (g *ClusterAgent) setToken() { | ||
rand.Seed(time.Now().UnixNano()) | ||
b := make([]byte, 64) | ||
rand.Read(b) | ||
g.token = fmt.Sprintf("%x", b) | ||
} | ||
|
||
func (g *ClusterAgent) startHeartBeat() { | ||
for { | ||
if _, err := g.client.AgentHealth(g.ctx, &servergrpc.AgentHealthRequest{Id: g.nodeID}); err != nil { | ||
logf.error("Server is not reachable anymore. Exit\n") | ||
os.Exit(1) | ||
} | ||
time.Sleep(10 * time.Second) | ||
} | ||
} | ||
|
||
// Launch a routine to catch SIGTERM Signal | ||
func (g *ClusterAgent) trapSignal() { | ||
ch := make(chan os.Signal, 1) | ||
signal.Notify(ch, os.Interrupt) | ||
signal.Notify(ch, syscall.SIGTERM) | ||
go func() { | ||
<-ch | ||
fmt.Println("adm-agent received SIGTERM signal") | ||
g.conn.Close() | ||
os.Exit(1) | ||
}() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package agentcore | ||
|
||
import ( | ||
"fmt" | ||
"net/http" | ||
) | ||
|
||
const baseURL = "/api/v1" | ||
|
||
type agentAPI struct { | ||
agent *ClusterAgent | ||
} | ||
|
||
//Start API server | ||
func (g *agentAPI) initAPI(agent *ClusterAgent) { | ||
g.agent = agent | ||
fmt.Println("Start API server on port " + conf.apiPort) | ||
go func() { | ||
http.HandleFunc(baseURL+"/health", g.agentHealth) | ||
http.ListenAndServe(":"+conf.apiPort, nil) | ||
}() | ||
} | ||
|
||
//for HEALTHCHECK Dockerfile instruction | ||
func (g *agentAPI) agentHealth(resp http.ResponseWriter, req *http.Request) { | ||
if g.agent.healthy { | ||
resp.WriteHeader(200) | ||
} else { | ||
resp.WriteHeader(400) | ||
} | ||
} |
Oops, something went wrong.