Add create qemu domain endpoint

Signed-off-by: Darko Draskovic <darko.draskovic@gmail.com>
This commit is contained in:
Darko Draskovic
2023-03-28 13:46:38 +02:00
parent e25abcf5e0
commit 8831a4f957
17 changed files with 790 additions and 26 deletions
+4
View File
@@ -3,3 +3,7 @@ docker_mfxkit:
run:
docker-compose -f docker/docker-compose.yml up
protoc:
protoc --go_out=. proto/*.proto
protoc --go-grpc_out=. proto/*.proto
+5 -1
View File
@@ -49,7 +49,11 @@ curl -i -X POST -H "Content-Type: application/json" localhost:9022/mfxkit -d '{"
## cURL
```sh
curl -i -X POST -H "Content-Type: application/json" localhost:9021/mfxkit -d '{"secret":"secret"}'
curl -i -X POST -H "Content-Type: application/json" localhost:9021/ping -d '{"secret":"secret"}'
```
```sh
curl -i -X POST -H "Content-Type: application/json" localhost:9021/domain -d '{"pool":"/home/darko/go/src/github.com/ultravioletrs/manager/cmd/manager/xml/pool.xml", "volume":"/home/darko/go/src/github.com/ultravioletrs/manager/cmd/manager/xml/vol.xml", "domain":"/home/darko/go/src/github.com/ultravioletrs/manager/cmd/manager/xml/dom.xml"}'
```
## Virsh
+14
View File
@@ -38,3 +38,17 @@ func (lm *loggingMiddleware) Ping(secret string) (response string, err error) {
return lm.svc.Ping(secret)
}
func (lm *loggingMiddleware) CreateDomain(pool, volume, domain string) (response string, err error) {
defer func(begin time.Time) {
message := fmt.Sprintf("Method CreateDomain for pool %s, volume %s, and domain %s took %s to complete",
pool, volume, domain, time.Since(begin))
if err != nil {
lm.logger.Warn(fmt.Sprintf("%s with error: %s.", message, err))
return
}
lm.logger.Info(fmt.Sprintf("%s without errors.", message))
}(time.Now())
return lm.svc.CreateDomain(pool, volume, domain)
}
+1
View File
@@ -0,0 +1 @@
package grpc
+1
View File
@@ -0,0 +1 @@
package grpc
+20
View File
@@ -0,0 +1,20 @@
package grpc
import "google.golang.org/protobuf/types/known/timestamppb"
type HealthRequest struct{}
type RunRequest struct {
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"`
Owner string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"`
StartTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
EndTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
Datasets []string `protobuf:"bytes,8,rep,name=datasets,proto3" json:"datasets,omitempty"`
Algorithms []string `protobuf:"bytes,9,rep,name=algorithms,proto3" json:"algorithms,omitempty"`
DatasetProviders []string `protobuf:"bytes,10,rep,name=dataset_providers,json=datasetProviders,proto3" json:"dataset_providers,omitempty"`
AlgorithmProviders []string `protobuf:"bytes,11,rep,name=algorithm_providers,json=algorithmProviders,proto3" json:"algorithm_providers,omitempty"`
Ttl int32 `protobuf:"varint,12,opt,name=ttl,proto3" json:"ttl,omitempty"`
ResultConsumers []string `protobuf:"bytes,13,rep,name=result_consumers,json=resultConsumers,proto3" json:"result_consumers,omitempty"`
}
+9
View File
@@ -0,0 +1,9 @@
package grpc
type RunResponse struct {
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
}
type HealthResponse struct {
Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
}
+1
View File
@@ -0,0 +1 @@
package grpc
+20
View File
@@ -29,3 +29,23 @@ func pingEndpoint(svc manager.Service) endpoint.Endpoint {
return res, nil
}
}
func createDomainEndpoint(svc manager.Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(createDomainReq)
if err := req.validate(); err != nil {
return nil, err
}
name, err := svc.CreateDomain(req.Pool, req.Volume, req.Domain)
if err != nil {
return nil, err
}
res := createDomainRes{
Name: name,
}
return res, nil
}
}
+14
View File
@@ -20,3 +20,17 @@ func (req pingReq) validate() error {
return nil
}
type createDomainReq struct {
Pool string `json:"pool"`
Volume string `json:"volume"`
Domain string `json:"domain"`
}
func (req createDomainReq) validate() error {
if req.Pool == "" || req.Volume == "" || req.Domain == "" {
return manager.ErrMalformedEntity
}
return nil
}
+16
View File
@@ -26,3 +26,19 @@ func (res pingRes) Headers() map[string]string {
func (res pingRes) Empty() bool {
return false
}
type createDomainRes struct {
Name string `json:"name"`
}
func (res createDomainRes) Code() int {
return http.StatusOK
}
func (res createDomainRes) Headers() map[string]string {
return map[string]string{}
}
func (res createDomainRes) Empty() bool {
return false
}
+21 -1
View File
@@ -38,13 +38,20 @@ func MakeHandler(tracer opentracing.Tracer, svc manager.Service) http.Handler {
r := bone.New()
r.Post("/mfxkit", kithttp.NewServer(
r.Post("/ping", kithttp.NewServer(
kitot.TraceServer(tracer, "ping")(pingEndpoint(svc)),
decodePing,
encodeResponse,
opts...,
))
r.Post("/domain", kithttp.NewServer(
kitot.TraceServer(tracer, "domain")(createDomainEndpoint(svc)),
decodeCreateDomain,
encodeResponse,
opts...,
))
r.GetFunc("/version", mainflux.Version("things"))
r.Handle("/metrics", promhttp.Handler())
@@ -64,6 +71,19 @@ func decodePing(_ context.Context, r *http.Request) (interface{}, error) {
return req, nil
}
func decodeCreateDomain(_ context.Context, r *http.Request) (interface{}, error) {
if !strings.Contains(r.Header.Get("Content-Type"), contentType) {
return nil, errUnsupportedContentType
}
req := createDomainReq{}
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
return nil, err
}
return req, nil
}
func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
w.Header().Set("Content-Type", contentType)
+9
View File
@@ -39,3 +39,12 @@ func (ms *metricsMiddleware) Ping(secret string) (response string, err error) {
return ms.svc.Ping(secret)
}
func (ms *metricsMiddleware) CreateDomain(pool, volume, domain string) (response string, err error) {
defer func(begin time.Time) {
ms.counter.With("method", "CreateDomain").Add(1)
ms.latency.With("method", "CreateDomain").Observe(time.Since(begin).Seconds())
}(time.Now())
return ms.svc.CreateDomain(pool, volume, domain)
}
+458
View File
@@ -0,0 +1,458 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
// protoc v3.12.4
// source: proto/manager.proto
package manager
import (
proto "github.com/golang/protobuf/proto"
timestamp "github.com/golang/protobuf/ptypes/timestamp"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4
type HealthRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
}
func (x *HealthRequest) Reset() {
*x = HealthRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_proto_manager_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *HealthRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HealthRequest) ProtoMessage() {}
func (x *HealthRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_manager_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HealthRequest.ProtoReflect.Descriptor instead.
func (*HealthRequest) Descriptor() ([]byte, []int) {
return file_proto_manager_proto_rawDescGZIP(), []int{0}
}
type HealthResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
}
func (x *HealthResponse) Reset() {
*x = HealthResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_proto_manager_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *HealthResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HealthResponse) ProtoMessage() {}
func (x *HealthResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_manager_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HealthResponse.ProtoReflect.Descriptor instead.
func (*HealthResponse) Descriptor() ([]byte, []int) {
return file_proto_manager_proto_rawDescGZIP(), []int{1}
}
func (x *HealthResponse) GetStatus() string {
if x != nil {
return x.Status
}
return ""
}
type RunRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"`
Owner string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"`
StartTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
EndTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
Datasets []string `protobuf:"bytes,8,rep,name=datasets,proto3" json:"datasets,omitempty"`
Algorithms []string `protobuf:"bytes,9,rep,name=algorithms,proto3" json:"algorithms,omitempty"`
DatasetProviders []string `protobuf:"bytes,10,rep,name=dataset_providers,json=datasetProviders,proto3" json:"dataset_providers,omitempty"`
AlgorithmProviders []string `protobuf:"bytes,11,rep,name=algorithm_providers,json=algorithmProviders,proto3" json:"algorithm_providers,omitempty"`
ResultConsumers []string `protobuf:"bytes,13,rep,name=result_consumers,json=resultConsumers,proto3" json:"result_consumers,omitempty"`
Ttl int32 `protobuf:"varint,12,opt,name=ttl,proto3" json:"ttl,omitempty"`
}
func (x *RunRequest) Reset() {
*x = RunRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_proto_manager_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RunRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RunRequest) ProtoMessage() {}
func (x *RunRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_manager_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RunRequest.ProtoReflect.Descriptor instead.
func (*RunRequest) Descriptor() ([]byte, []int) {
return file_proto_manager_proto_rawDescGZIP(), []int{2}
}
func (x *RunRequest) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *RunRequest) GetDescription() string {
if x != nil {
return x.Description
}
return ""
}
func (x *RunRequest) GetStatus() string {
if x != nil {
return x.Status
}
return ""
}
func (x *RunRequest) GetOwner() string {
if x != nil {
return x.Owner
}
return ""
}
func (x *RunRequest) GetStartTime() *timestamp.Timestamp {
if x != nil {
return x.StartTime
}
return nil
}
func (x *RunRequest) GetEndTime() *timestamp.Timestamp {
if x != nil {
return x.EndTime
}
return nil
}
func (x *RunRequest) GetDatasets() []string {
if x != nil {
return x.Datasets
}
return nil
}
func (x *RunRequest) GetAlgorithms() []string {
if x != nil {
return x.Algorithms
}
return nil
}
func (x *RunRequest) GetDatasetProviders() []string {
if x != nil {
return x.DatasetProviders
}
return nil
}
func (x *RunRequest) GetAlgorithmProviders() []string {
if x != nil {
return x.AlgorithmProviders
}
return nil
}
func (x *RunRequest) GetResultConsumers() []string {
if x != nil {
return x.ResultConsumers
}
return nil
}
func (x *RunRequest) GetTtl() int32 {
if x != nil {
return x.Ttl
}
return 0
}
type RunResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
}
func (x *RunResponse) Reset() {
*x = RunResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_proto_manager_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RunResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RunResponse) ProtoMessage() {}
func (x *RunResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_manager_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RunResponse.ProtoReflect.Descriptor instead.
func (*RunResponse) Descriptor() ([]byte, []int) {
return file_proto_manager_proto_rawDescGZIP(), []int{3}
}
func (x *RunResponse) GetMessage() string {
if x != nil {
return x.Message
}
return ""
}
var File_proto_manager_proto protoreflect.FileDescriptor
var file_proto_manager_proto_rawDesc = []byte{
0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0f, 0x0a, 0x0d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x28, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a,
0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77,
0x6e, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d,
0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35,
0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e,
0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74,
0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74,
0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x73, 0x18,
0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d,
0x73, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f,
0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, 0x61,
0x74, 0x61, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2f,
0x0a, 0x13, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x76,
0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x6c, 0x67,
0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12,
0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d,
0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c,
0x74, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74,
0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x27, 0x0a, 0x0b,
0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d,
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,
0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x99, 0x01, 0x0a, 0x0e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c,
0x74, 0x68, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x00, 0x12, 0x3e, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x19, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67,
0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x00, 0x42, 0x0b, 0x5a, 0x09, 0x2e, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x62, 0x06,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_proto_manager_proto_rawDescOnce sync.Once
file_proto_manager_proto_rawDescData = file_proto_manager_proto_rawDesc
)
func file_proto_manager_proto_rawDescGZIP() []byte {
file_proto_manager_proto_rawDescOnce.Do(func() {
file_proto_manager_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_manager_proto_rawDescData)
})
return file_proto_manager_proto_rawDescData
}
var file_proto_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_proto_manager_proto_goTypes = []interface{}{
(*HealthRequest)(nil), // 0: manager_proto.HealthRequest
(*HealthResponse)(nil), // 1: manager_proto.HealthResponse
(*RunRequest)(nil), // 2: manager_proto.RunRequest
(*RunResponse)(nil), // 3: manager_proto.RunResponse
(*timestamp.Timestamp)(nil), // 4: google.protobuf.Timestamp
}
var file_proto_manager_proto_depIdxs = []int32{
4, // 0: manager_proto.RunRequest.start_time:type_name -> google.protobuf.Timestamp
4, // 1: manager_proto.RunRequest.end_time:type_name -> google.protobuf.Timestamp
0, // 2: manager_proto.ManagerService.Health:input_type -> manager_proto.HealthRequest
2, // 3: manager_proto.ManagerService.Run:input_type -> manager_proto.RunRequest
1, // 4: manager_proto.ManagerService.Health:output_type -> manager_proto.HealthResponse
3, // 5: manager_proto.ManagerService.Run:output_type -> manager_proto.RunResponse
4, // [4:6] is the sub-list for method output_type
2, // [2:4] is the sub-list for method input_type
2, // [2:2] is the sub-list for extension type_name
2, // [2:2] is the sub-list for extension extendee
0, // [0:2] is the sub-list for field type_name
}
func init() { file_proto_manager_proto_init() }
func file_proto_manager_proto_init() {
if File_proto_manager_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_proto_manager_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*HealthRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_proto_manager_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*HealthResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_proto_manager_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RunRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_proto_manager_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RunResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_manager_proto_rawDesc,
NumEnums: 0,
NumMessages: 4,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_proto_manager_proto_goTypes,
DependencyIndexes: file_proto_manager_proto_depIdxs,
MessageInfos: file_proto_manager_proto_msgTypes,
}.Build()
File_proto_manager_proto = out.File
file_proto_manager_proto_rawDesc = nil
file_proto_manager_proto_goTypes = nil
file_proto_manager_proto_depIdxs = nil
}
+137
View File
@@ -0,0 +1,137 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
package manager
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// ManagerServiceClient is the client API for ManagerService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type ManagerServiceClient interface {
Health(ctx context.Context, in *HealthRequest, opts ...grpc.CallOption) (*HealthResponse, error)
Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*RunResponse, error)
}
type managerServiceClient struct {
cc grpc.ClientConnInterface
}
func NewManagerServiceClient(cc grpc.ClientConnInterface) ManagerServiceClient {
return &managerServiceClient{cc}
}
func (c *managerServiceClient) Health(ctx context.Context, in *HealthRequest, opts ...grpc.CallOption) (*HealthResponse, error) {
out := new(HealthResponse)
err := c.cc.Invoke(ctx, "/manager_proto.ManagerService/Health", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *managerServiceClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*RunResponse, error) {
out := new(RunResponse)
err := c.cc.Invoke(ctx, "/manager_proto.ManagerService/Run", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// ManagerServiceServer is the server API for ManagerService service.
// All implementations must embed UnimplementedManagerServiceServer
// for forward compatibility
type ManagerServiceServer interface {
Health(context.Context, *HealthRequest) (*HealthResponse, error)
Run(context.Context, *RunRequest) (*RunResponse, error)
mustEmbedUnimplementedManagerServiceServer()
}
// UnimplementedManagerServiceServer must be embedded to have forward compatible implementations.
type UnimplementedManagerServiceServer struct {
}
func (UnimplementedManagerServiceServer) Health(context.Context, *HealthRequest) (*HealthResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Health not implemented")
}
func (UnimplementedManagerServiceServer) Run(context.Context, *RunRequest) (*RunResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Run not implemented")
}
func (UnimplementedManagerServiceServer) mustEmbedUnimplementedManagerServiceServer() {}
// UnsafeManagerServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to ManagerServiceServer will
// result in compilation errors.
type UnsafeManagerServiceServer interface {
mustEmbedUnimplementedManagerServiceServer()
}
func RegisterManagerServiceServer(s grpc.ServiceRegistrar, srv ManagerServiceServer) {
s.RegisterService(&ManagerService_ServiceDesc, srv)
}
func _ManagerService_Health_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(HealthRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ManagerServiceServer).Health(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/manager_proto.ManagerService/Health",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ManagerServiceServer).Health(ctx, req.(*HealthRequest))
}
return interceptor(ctx, in, info, handler)
}
func _ManagerService_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RunRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ManagerServiceServer).Run(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/manager_proto.ManagerService/Run",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ManagerServiceServer).Run(ctx, req.(*RunRequest))
}
return interceptor(ctx, in, info, handler)
}
// ManagerService_ServiceDesc is the grpc.ServiceDesc for ManagerService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var ManagerService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "manager_proto.ManagerService",
HandlerType: (*ManagerServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "Health",
Handler: _ManagerService_Health_Handler,
},
{
MethodName: "Run",
Handler: _ManagerService_Run_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "proto/manager.proto",
}
+28 -24
View File
@@ -34,6 +34,7 @@ var (
type Service interface {
// Ping compares a given string with secret
Ping(string) (string, error)
CreateDomain(pool, volume, domain string) (string, error)
}
type managerService struct {
@@ -52,32 +53,35 @@ func New(secret string, libvirtConn *libvirt.Libvirt) Service {
}
func (ks *managerService) Ping(secret string) (string, error) {
bytes, err := os.ReadFile(poolXML)
if err != nil {
return "", ErrNotFound
}
poolStr := string(bytes)
bytes, err = os.ReadFile(volXML)
if err != nil {
return "", ErrNotFound
}
volStr := string(bytes)
bytes, err = os.ReadFile(domXML)
if err != nil {
return "", ErrNotFound
}
domStr := string(bytes)
dom, err := createDomain(ks.libvirt, poolStr, volStr, domStr)
if err != nil {
return "", ErrMalformedEntity
}
_ = dom
if ks.secret != secret {
return "", ErrUnauthorizedAccess
}
return "Hello World :)", nil
}
func (ks *managerService) CreateDomain(poolXML, volXML, domXML string) (string, error) {
poolBytes, err := os.ReadFile(poolXML)
if err != nil {
return "", ErrNotFound
}
poolStr := string(poolBytes)
volBytes, err := os.ReadFile(volXML)
if err != nil {
return "", ErrNotFound
}
volStr := string(volBytes)
domBytes, err := os.ReadFile(domXML)
if err != nil {
return "", ErrNotFound
}
domStr := string(domBytes)
dom, err := createDomain(ks.libvirt, poolStr, volStr, domStr)
if err != nil {
return "", ErrMalformedEntity
}
return dom.Name, nil
}
+32
View File
@@ -0,0 +1,32 @@
syntax = "proto3";
import "google/protobuf/timestamp.proto";
package manager_proto;
option go_package = "./manager";
service ManagerService {
rpc Health(HealthRequest) returns (HealthResponse) {}
rpc Run(RunRequest) returns (RunResponse) {}
}
message HealthRequest {}
message HealthResponse { string status = 1; }
message RunRequest {
string name = 2;
string description = 3;
string status = 4;
string owner = 5;
google.protobuf.Timestamp start_time = 6;
google.protobuf.Timestamp end_time = 7;
repeated string datasets = 8;
repeated string algorithms = 9;
repeated string dataset_providers = 10;
repeated string algorithm_providers = 11;
repeated string result_consumers = 13;
int32 ttl = 12;
}
message RunResponse { string message = 1; }