// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0

// test_agent is used by the Equinix Metal Manager test code. Its only role
// is to ensure successful delivery of the BMaaS agent executable to the test
// hosts, together with its subsequent execution.
package main

import (
	"crypto/ed25519"
	"crypto/rand"
	"fmt"
	"io"
	"os"

	"google.golang.org/protobuf/proto"

	apb "source.monogon.dev/cloud/agent/api"
)

func main() {
	// The agent initialization message will arrive from Shepherd on Agent's
	// standard input.
	aimb, err := io.ReadAll(os.Stdin)
	if err != nil {
		fmt.Fprintf(os.Stderr, "while reading AgentInit message: %v\n", err)
		return
	}
	var aim apb.TakeoverInit
	if err := proto.Unmarshal(aimb, &aim); err != nil {
		fmt.Fprintf(os.Stderr, "while unmarshaling TakeoverInit message: %v\n", err)
		return
	}

	// Agent should send back apb.TakeoverResponse on its standard output.
	pub, _, err := ed25519.GenerateKey(rand.Reader)
	if err != nil {
		fmt.Fprintf(os.Stderr, "while generating agent public key: %v\n", err)
		return
	}
	arsp := apb.TakeoverResponse{
		Result: &apb.TakeoverResponse_Success{Success: &apb.TakeoverSuccess{
			InitMessage: &aim,
			Key:         pub,
		}},
	}
	arspb, err := proto.Marshal(&arsp)
	if err != nil {
		fmt.Fprintf(os.Stderr, "while marshaling TakeoverResponse message: %v\n", err)
		return
	}
	if _, err := os.Stdout.Write(arspb); err != nil {
		fmt.Fprintf(os.Stderr, "while writing TakeoverResponse message: %v\n", err)
	}
	// The agent must detach and/or terminate after sending back the reply.
	// Failure to do so will leave the session hanging.
}
