mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-24 17:35:01 +01:00
95 lines
1.9 KiB
Go
95 lines
1.9 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/zrepl/zrepl/cli"
|
|
"github.com/zrepl/zrepl/config"
|
|
"github.com/zrepl/zrepl/daemon"
|
|
"github.com/zrepl/zrepl/daemon/job"
|
|
)
|
|
|
|
var TriggerCmd = &cli.Subcommand{
|
|
Use: "trigger JOB [replication|snapshot]",
|
|
Short: "",
|
|
Run: func(ctx context.Context, subcommand *cli.Subcommand, args []string) error {
|
|
return runTriggerCmd(subcommand.Config(), args)
|
|
},
|
|
}
|
|
|
|
type TriggerToken struct {
|
|
// TODO version, daemon invocation id, etc.
|
|
Job string
|
|
InvocationId uint64
|
|
}
|
|
|
|
func (t TriggerToken) Encode() string {
|
|
j, err := json.Marshal(t)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return string(j)
|
|
}
|
|
|
|
func (t *TriggerToken) Decode(s string) error {
|
|
return json.Unmarshal([]byte(s), t)
|
|
}
|
|
|
|
func (t TriggerToken) ToReset() daemon.ControlJobEndpointResetActiveRequest {
|
|
return daemon.ControlJobEndpointResetActiveRequest{
|
|
Job: t.Job,
|
|
ActiveSideResetRequest: job.ActiveSideResetRequest{
|
|
InvocationId: t.InvocationId,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (t TriggerToken) ToWait() daemon.ControlJobEndpointWaitActiveRequest {
|
|
return daemon.ControlJobEndpointWaitActiveRequest{
|
|
Job: t.Job,
|
|
ActiveSidePollRequest: job.ActiveSidePollRequest{
|
|
InvocationId: t.InvocationId,
|
|
},
|
|
}
|
|
}
|
|
|
|
func runTriggerCmd(config *config.Config, args []string) error {
|
|
if len(args) != 2 {
|
|
return errors.Errorf("Expected 2 arguments: [replication|reset|snapshot] JOB")
|
|
}
|
|
|
|
httpc, err := controlHttpClient(config.Global.Control.SockPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
jobName := args[0]
|
|
what := args[1]
|
|
|
|
var res job.ActiveSideSignalResponse
|
|
err = jsonRequestResponse(httpc, daemon.ControlJobEndpointTriggerActive,
|
|
struct {
|
|
Job string
|
|
job.ActiveSideTriggerRequest
|
|
}{
|
|
Job: jobName,
|
|
ActiveSideTriggerRequest: job.ActiveSideTriggerRequest{
|
|
What: what,
|
|
},
|
|
},
|
|
&res,
|
|
)
|
|
|
|
token := TriggerToken{
|
|
Job: jobName,
|
|
InvocationId: res.InvocationId,
|
|
}
|
|
|
|
fmt.Println(token.Encode())
|
|
return err
|
|
}
|