111 lines
2.7 KiB
Go
111 lines
2.7 KiB
Go
package docker
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/moby/moby/api/types/mount"
|
|
"github.com/moby/moby/api/types/network"
|
|
"github.com/moby/moby/api/types/swarm"
|
|
"github.com/moby/moby/client"
|
|
)
|
|
|
|
func prepare(w http.ResponseWriter, r *http.Request){
|
|
if r.Method != http.MethodPost{
|
|
w.WriteHeader(http.StatusMethodNotAllowed);
|
|
fmt.Fprint(w, "Method Not Allowed");
|
|
return;
|
|
}
|
|
|
|
//if !bearerAuth(w, r){
|
|
// return;
|
|
//}
|
|
|
|
rawBody, err := io.ReadAll(r.Body);
|
|
if err != nil {
|
|
panic("Failed to read body!");
|
|
}
|
|
|
|
var bodyDecoded struct{
|
|
ServiceId string `json:"serviceId"`
|
|
};
|
|
|
|
err = json.Unmarshal(rawBody, &bodyDecoded);
|
|
if err != nil {
|
|
panic("Failed to unmarshal json."+ err.Error());
|
|
}
|
|
|
|
scaleDown(bodyDecoded.ServiceId);
|
|
|
|
inspectResoults, err := ApiClient.ServiceInspect(context.Background(), bodyDecoded.ServiceId, client.ServiceInspectOptions{});
|
|
if err != nil{
|
|
panic("Failed to inspect service."+ err.Error());
|
|
}
|
|
|
|
labels := inspectResoults.Service.Spec.Labels;
|
|
time.Sleep(10);
|
|
|
|
maxConcurrent := uint64(1);
|
|
totalCompletions := uint64(1);
|
|
targetVolumes := strings.Split(labels["blazena.volumes"], ",");
|
|
targetNode := labels["blazena.node"];
|
|
helperCommand := `apk add openssh rsync && \
|
|
ssh-keygen -t ed25519 -f /host_key && \
|
|
mkdir -p /root/.ssh/ && \
|
|
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIByYbl8vu946LPycSO5pBohq3vMvvl+wX7snu1Bqpd7p test" > /root/.ssh/authorized_keys && \
|
|
/usr/sbin/sshd -h /host_key -p 22 -D`;
|
|
|
|
for _, targetVolume := range targetVolumes{
|
|
|
|
_, err := ApiClient.ServiceCreate(context.Background(), client.ServiceCreateOptions{
|
|
Spec: swarm.ServiceSpec{
|
|
Annotations: swarm.Annotations{
|
|
Labels: map[string]string{"blazena.helper": "true"},
|
|
},
|
|
Mode: swarm.ServiceMode{
|
|
ReplicatedJob: &swarm.ReplicatedJob{
|
|
MaxConcurrent: &maxConcurrent,
|
|
TotalCompletions: &totalCompletions,
|
|
},
|
|
},
|
|
TaskTemplate: swarm.TaskSpec{
|
|
ContainerSpec: &swarm.ContainerSpec{
|
|
Image: "docker.io/library/alpine:latest",
|
|
Command: []string{"sh", "-c", helperCommand},
|
|
Mounts: []mount.Mount{
|
|
mount.Mount{
|
|
Source: targetVolume,
|
|
Target: "/volume",
|
|
Type: "volume",
|
|
},
|
|
},
|
|
},
|
|
Placement: &swarm.Placement{
|
|
Constraints: []string{"node.hostname=="+targetNode},
|
|
},
|
|
},
|
|
EndpointSpec: &swarm.EndpointSpec{
|
|
Ports: []swarm.PortConfig{
|
|
swarm.PortConfig{
|
|
Protocol: network.TCP,
|
|
TargetPort: uint32(22),
|
|
PublishedPort: uint32(2222),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
if err != nil {
|
|
panic("Failed to create helper service."+ err.Error());
|
|
}
|
|
|
|
fmt.Fprint(w, bodyDecoded.ServiceId);
|
|
}
|
|
}
|