db interactions

This commit is contained in:
rushtehrani
2019-12-11 20:34:17 -08:00
parent 0b10fc9dd9
commit d765069256
15 changed files with 388 additions and 81 deletions

View File

@@ -8,6 +8,7 @@ go get -u github.com/pressly/goose/cmd/goose
Note: Up migration are automatically executed when the application is run.
```bash
goose -dir db create <name> sql # Create migration in db folder
goose -dir db postgres "${DB_DATASOURCE}" up # Migrate the DB to the most recent version available
goose -dir db postgres "${DB_DATASOURCE}" down # Roll back the version by 1
goose help # See all available commands

View File

@@ -191,27 +191,30 @@ func init() {
func init() { proto.RegisterFile("workflow.proto", fileDescriptor_892c7f566756b0be) }
var fileDescriptor_892c7f566756b0be = []byte{
// 318 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xc1, 0x4e, 0xc2, 0x40,
0x10, 0x86, 0x53, 0x8a, 0x84, 0x0e, 0x11, 0xc9, 0x46, 0x62, 0xd3, 0x70, 0x20, 0xf5, 0x82, 0x97,
0x36, 0x60, 0xb8, 0x78, 0x33, 0xbe, 0x80, 0xa9, 0x26, 0x1e, 0x75, 0xc0, 0x91, 0x54, 0x4b, 0x77,
0xdd, 0x5d, 0xe0, 0x60, 0xb8, 0xf8, 0x0a, 0x3e, 0x82, 0x8f, 0xe4, 0x2b, 0xf8, 0x20, 0x86, 0x2d,
0xbb, 0x42, 0xf4, 0x36, 0x9d, 0xf9, 0xfb, 0xcd, 0xbf, 0xff, 0x40, 0x7b, 0xc5, 0xe5, 0xcb, 0x53,
0xc1, 0x57, 0x89, 0x90, 0x5c, 0x73, 0xe6, 0xa3, 0xc8, 0xa3, 0xde, 0x8c, 0xf3, 0x59, 0x41, 0x29,
0x8a, 0x3c, 0xc5, 0xb2, 0xe4, 0x1a, 0x75, 0xce, 0x4b, 0x55, 0x49, 0xa2, 0x13, 0xfb, 0xcb, 0xbd,
0xa6, 0xb9, 0x28, 0x50, 0x53, 0x35, 0x88, 0x1f, 0xa0, 0x7b, 0x25, 0x09, 0x35, 0xdd, 0x6d, 0x05,
0x19, 0xbd, 0x2e, 0x48, 0x69, 0xd6, 0x83, 0xa0, 0xc4, 0x39, 0x29, 0x81, 0x53, 0x0a, 0xbd, 0xbe,
0x37, 0x08, 0xb2, 0xdf, 0x06, 0x3b, 0x83, 0xa6, 0x25, 0x86, 0xb5, 0xbe, 0x37, 0x68, 0x8d, 0x0e,
0x13, 0x14, 0x79, 0xe2, 0x28, 0x6e, 0x1c, 0x7f, 0x7a, 0xd0, 0xb4, 0x6d, 0xd6, 0x01, 0x7f, 0x91,
0x3f, 0x6e, 0x79, 0x9b, 0x92, 0x31, 0xa8, 0x6f, 0xb0, 0x86, 0x12, 0x64, 0xa6, 0x66, 0x09, 0x80,
0x40, 0x89, 0x73, 0xd2, 0x24, 0x55, 0xe8, 0xf7, 0xfd, 0x41, 0x6b, 0xd4, 0x36, 0xfc, 0x6b, 0xdb,
0xce, 0x76, 0x14, 0xec, 0x12, 0x3a, 0x76, 0xdd, 0xed, 0xf6, 0x79, 0x61, 0xdd, 0xb8, 0xea, 0xee,
0xb9, 0xb2, 0xc3, 0xec, 0x8f, 0x3c, 0x1e, 0x43, 0xe0, 0xd8, 0xce, 0x93, 0xb7, 0xe3, 0xe9, 0x18,
0x0e, 0x96, 0x58, 0x2c, 0xac, 0xd1, 0xea, 0x63, 0xb4, 0x86, 0x23, 0x0b, 0xbf, 0x21, 0xb9, 0xcc,
0xa7, 0xc4, 0x9e, 0xa1, 0x51, 0x25, 0xca, 0x22, 0xb3, 0xfc, 0xdf, 0x78, 0xa3, 0xfd, 0xb8, 0xe2,
0xf1, 0xfb, 0xd7, 0xf7, 0x47, 0x2d, 0x8d, 0x4f, 0x37, 0xf7, 0x53, 0xe9, 0x72, 0x38, 0x21, 0x8d,
0xc3, 0xf4, 0xcd, 0x25, 0xbe, 0x4e, 0xad, 0x65, 0x75, 0xe1, 0xb2, 0x9d, 0x34, 0xcc, 0x11, 0xcf,
0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x67, 0x35, 0xdb, 0xc1, 0x12, 0x02, 0x00, 0x00,
// 356 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0x41, 0x4f, 0xf2, 0x30,
0x18, 0xc7, 0x33, 0xc6, 0xfb, 0x86, 0x3d, 0x44, 0x24, 0x8d, 0xe8, 0xb2, 0x70, 0x20, 0xf5, 0x82,
0x89, 0xd9, 0x02, 0x86, 0x0b, 0x27, 0x8d, 0x89, 0x67, 0x33, 0x4d, 0x3c, 0x6a, 0xc1, 0x47, 0xb2,
0x38, 0xd6, 0xd9, 0x16, 0x38, 0x18, 0x2f, 0x7e, 0x05, 0x8f, 0x1e, 0xf9, 0x48, 0x7e, 0x05, 0x3f,
0x88, 0xa1, 0xac, 0x95, 0x05, 0x12, 0x6f, 0xdd, 0xf3, 0x3c, 0xfb, 0xf5, 0xd7, 0x7f, 0x0b, 0x8d,
0x05, 0x17, 0xcf, 0x4f, 0x29, 0x5f, 0x84, 0xb9, 0xe0, 0x8a, 0x13, 0x97, 0xe5, 0x49, 0xd0, 0x9e,
0x70, 0x3e, 0x49, 0x31, 0x62, 0x79, 0x12, 0xb1, 0x2c, 0xe3, 0x8a, 0xa9, 0x84, 0x67, 0x72, 0x3d,
0x12, 0x1c, 0x99, 0x5f, 0xee, 0x15, 0x4e, 0xf3, 0x94, 0x29, 0x5c, 0x37, 0xe8, 0x03, 0xb4, 0x2e,
0x05, 0x32, 0x85, 0x77, 0xc5, 0x40, 0x8c, 0x2f, 0x33, 0x94, 0x8a, 0xb4, 0xc1, 0xcb, 0xd8, 0x14,
0x65, 0xce, 0xc6, 0xe8, 0x3b, 0x1d, 0xa7, 0xeb, 0xc5, 0xbf, 0x05, 0x72, 0x02, 0x35, 0x43, 0xf4,
0x2b, 0x1d, 0xa7, 0x5b, 0xef, 0xef, 0x85, 0x2c, 0x4f, 0x42, 0x4b, 0xb1, 0x6d, 0xba, 0x74, 0xa0,
0x66, 0xca, 0xa4, 0x09, 0xee, 0x2c, 0x79, 0x2c, 0x78, 0xab, 0x25, 0x21, 0x50, 0x5d, 0x61, 0x35,
0xc5, 0x8b, 0xf5, 0x9a, 0x84, 0x00, 0x39, 0x13, 0x6c, 0x8a, 0x0a, 0x85, 0xf4, 0xdd, 0x8e, 0xdb,
0xad, 0xf7, 0x1b, 0x9a, 0x7f, 0x6d, 0xca, 0xf1, 0xc6, 0x04, 0xb9, 0x80, 0xa6, 0xd9, 0xee, 0xb6,
0x38, 0x9e, 0x5f, 0xd5, 0x56, 0xad, 0x92, 0x95, 0x69, 0xc6, 0x5b, 0xe3, 0x74, 0x00, 0x9e, 0x65,
0x5b, 0x27, 0x67, 0xc3, 0xe9, 0x00, 0xfe, 0xcd, 0x59, 0x3a, 0x33, 0xa2, 0xeb, 0x8f, 0xfe, 0xb2,
0x02, 0xfb, 0x86, 0x7e, 0x83, 0x62, 0x9e, 0x8c, 0x91, 0x08, 0x68, 0x94, 0x23, 0x25, 0x81, 0xb6,
0xd8, 0x99, 0x73, 0x50, 0xce, 0x8d, 0x0e, 0xde, 0xbf, 0xbe, 0x3f, 0x2a, 0x11, 0x3d, 0x5e, 0x5d,
0xa4, 0x8c, 0xe6, 0xbd, 0x11, 0x2a, 0xd6, 0x8b, 0x5e, 0x6d, 0xf4, 0x6f, 0x91, 0x71, 0x97, 0x43,
0x1b, 0x32, 0xf9, 0x74, 0xe0, 0xb0, 0xcc, 0x37, 0x27, 0x23, 0x74, 0xc7, 0xe6, 0x36, 0x88, 0x42,
0x62, 0x77, 0x4c, 0xf4, 0x4a, 0xcb, 0x9c, 0xd3, 0xd3, 0xbf, 0x65, 0xec, 0xbb, 0x92, 0xc3, 0xad,
0x70, 0x47, 0xff, 0xf5, 0x5b, 0x3b, 0xfb, 0x09, 0x00, 0x00, 0xff, 0xff, 0x76, 0xfd, 0x6f, 0x76,
0xb9, 0x02, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -227,7 +230,8 @@ const _ = grpc.SupportPackageIsVersion4
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type WorkflowServiceClient interface {
// Creates a Workflow
Create(ctx context.Context, in *CreateWorkflowRequest, opts ...grpc.CallOption) (*Workflow, error)
CreateWorkflow(ctx context.Context, in *CreateWorkflowRequest, opts ...grpc.CallOption) (*Workflow, error)
CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error)
}
type workflowServiceClient struct {
@@ -238,9 +242,18 @@ func NewWorkflowServiceClient(cc *grpc.ClientConn) WorkflowServiceClient {
return &workflowServiceClient{cc}
}
func (c *workflowServiceClient) Create(ctx context.Context, in *CreateWorkflowRequest, opts ...grpc.CallOption) (*Workflow, error) {
func (c *workflowServiceClient) CreateWorkflow(ctx context.Context, in *CreateWorkflowRequest, opts ...grpc.CallOption) (*Workflow, error) {
out := new(Workflow)
err := c.cc.Invoke(ctx, "/api.WorkflowService/Create", in, out, opts...)
err := c.cc.Invoke(ctx, "/api.WorkflowService/CreateWorkflow", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *workflowServiceClient) CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) {
out := new(WorkflowTemplate)
err := c.cc.Invoke(ctx, "/api.WorkflowService/CreateWorkflowTemplate", in, out, opts...)
if err != nil {
return nil, err
}
@@ -250,35 +263,57 @@ func (c *workflowServiceClient) Create(ctx context.Context, in *CreateWorkflowRe
// WorkflowServiceServer is the server API for WorkflowService service.
type WorkflowServiceServer interface {
// Creates a Workflow
Create(context.Context, *CreateWorkflowRequest) (*Workflow, error)
CreateWorkflow(context.Context, *CreateWorkflowRequest) (*Workflow, error)
CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error)
}
// UnimplementedWorkflowServiceServer can be embedded to have forward compatible implementations.
type UnimplementedWorkflowServiceServer struct {
}
func (*UnimplementedWorkflowServiceServer) Create(ctx context.Context, req *CreateWorkflowRequest) (*Workflow, error) {
return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
func (*UnimplementedWorkflowServiceServer) CreateWorkflow(ctx context.Context, req *CreateWorkflowRequest) (*Workflow, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateWorkflow not implemented")
}
func (*UnimplementedWorkflowServiceServer) CreateWorkflowTemplate(ctx context.Context, req *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateWorkflowTemplate not implemented")
}
func RegisterWorkflowServiceServer(s *grpc.Server, srv WorkflowServiceServer) {
s.RegisterService(&_WorkflowService_serviceDesc, srv)
}
func _WorkflowService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
func _WorkflowService_CreateWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateWorkflowRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WorkflowServiceServer).Create(ctx, in)
return srv.(WorkflowServiceServer).CreateWorkflow(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.WorkflowService/Create",
FullMethod: "/api.WorkflowService/CreateWorkflow",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WorkflowServiceServer).Create(ctx, req.(*CreateWorkflowRequest))
return srv.(WorkflowServiceServer).CreateWorkflow(ctx, req.(*CreateWorkflowRequest))
}
return interceptor(ctx, in, info, handler)
}
func _WorkflowService_CreateWorkflowTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateWorkflowTemplateRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WorkflowServiceServer).CreateWorkflowTemplate(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.WorkflowService/CreateWorkflowTemplate",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WorkflowServiceServer).CreateWorkflowTemplate(ctx, req.(*CreateWorkflowTemplateRequest))
}
return interceptor(ctx, in, info, handler)
}
@@ -288,8 +323,12 @@ var _WorkflowService_serviceDesc = grpc.ServiceDesc{
HandlerType: (*WorkflowServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "Create",
Handler: _WorkflowService_Create_Handler,
MethodName: "CreateWorkflow",
Handler: _WorkflowService_CreateWorkflow_Handler,
},
{
MethodName: "CreateWorkflowTemplate",
Handler: _WorkflowService_CreateWorkflowTemplate_Handler,
},
},
Streams: []grpc.StreamDesc{},

View File

@@ -31,7 +31,7 @@ var _ = runtime.String
var _ = utilities.NewDoubleArray
var _ = descriptor.ForMessage
func request_WorkflowService_Create_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
func request_WorkflowService_CreateWorkflow_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq CreateWorkflowRequest
var metadata runtime.ServerMetadata
@@ -61,12 +61,12 @@ func request_WorkflowService_Create_0(ctx context.Context, marshaler runtime.Mar
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
}
msg, err := client.Create(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
msg, err := client.CreateWorkflow(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_WorkflowService_Create_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
func local_request_WorkflowService_CreateWorkflow_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq CreateWorkflowRequest
var metadata runtime.ServerMetadata
@@ -96,7 +96,77 @@ func local_request_WorkflowService_Create_0(ctx context.Context, marshaler runti
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
}
msg, err := server.Create(ctx, &protoReq)
msg, err := server.CreateWorkflow(ctx, &protoReq)
return msg, metadata, err
}
func request_WorkflowService_CreateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq CreateWorkflowTemplateRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.WorkflowTemplate); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["namespace"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
}
protoReq.Namespace, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
}
msg, err := client.CreateWorkflowTemplate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_WorkflowService_CreateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq CreateWorkflowTemplateRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.WorkflowTemplate); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["namespace"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
}
protoReq.Namespace, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
}
msg, err := server.CreateWorkflowTemplate(ctx, &protoReq)
return msg, metadata, err
}
@@ -106,7 +176,7 @@ func local_request_WorkflowService_Create_0(ctx context.Context, marshaler runti
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
func RegisterWorkflowServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WorkflowServiceServer) error {
mux.Handle("POST", pattern_WorkflowService_Create_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
mux.Handle("POST", pattern_WorkflowService_CreateWorkflow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
@@ -115,14 +185,34 @@ func RegisterWorkflowServiceHandlerServer(ctx context.Context, mux *runtime.Serv
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_WorkflowService_Create_0(rctx, inboundMarshaler, server, req, pathParams)
resp, md, err := local_request_WorkflowService_CreateWorkflow_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WorkflowService_Create_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
forward_WorkflowService_CreateWorkflow_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("POST", pattern_WorkflowService_CreateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_WorkflowService_CreateWorkflowTemplate_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WorkflowService_CreateWorkflowTemplate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
@@ -167,7 +257,7 @@ func RegisterWorkflowServiceHandler(ctx context.Context, mux *runtime.ServeMux,
// "WorkflowServiceClient" to call the correct interceptors.
func RegisterWorkflowServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WorkflowServiceClient) error {
mux.Handle("POST", pattern_WorkflowService_Create_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
mux.Handle("POST", pattern_WorkflowService_CreateWorkflow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
@@ -176,14 +266,34 @@ func RegisterWorkflowServiceHandlerClient(ctx context.Context, mux *runtime.Serv
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_WorkflowService_Create_0(rctx, inboundMarshaler, client, req, pathParams)
resp, md, err := request_WorkflowService_CreateWorkflow_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WorkflowService_Create_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
forward_WorkflowService_CreateWorkflow_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("POST", pattern_WorkflowService_CreateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_WorkflowService_CreateWorkflowTemplate_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WorkflowService_CreateWorkflowTemplate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
@@ -191,9 +301,13 @@ func RegisterWorkflowServiceHandlerClient(ctx context.Context, mux *runtime.Serv
}
var (
pattern_WorkflowService_Create_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflows"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_WorkflowService_CreateWorkflow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflows"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_WorkflowService_CreateWorkflowTemplate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflow_templates"}, "", runtime.AssumeColonVerbOpt(true)))
)
var (
forward_WorkflowService_Create_0 = runtime.ForwardResponseMessage
forward_WorkflowService_CreateWorkflow_0 = runtime.ForwardResponseMessage
forward_WorkflowService_CreateWorkflowTemplate_0 = runtime.ForwardResponseMessage
)

View File

@@ -7,12 +7,19 @@ import "workflow_template.proto";
service WorkflowService {
// Creates a Workflow
rpc Create (CreateWorkflowRequest) returns (Workflow) {
rpc CreateWorkflow (CreateWorkflowRequest) returns (Workflow) {
option (google.api.http) = {
post: "/apis/v1beta1/{namespace}/workflows"
body: "workflow"
};
}
rpc CreateWorkflowTemplate (CreateWorkflowTemplateRequest) returns (WorkflowTemplate) {
option (google.api.http) = {
post: "/apis/v1beta1/{namespace}/workflow_templates"
body: "workflowTemplate"
};
}
}
message CreateWorkflowRequest {

View File

@@ -11,10 +11,42 @@
"application/json"
],
"paths": {
"/apis/v1beta1/{namespace}/workflow_templates": {
"post": {
"operationId": "CreateWorkflowTemplate",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/apiWorkflowTemplate"
}
}
},
"parameters": [
{
"name": "namespace",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/apiWorkflowTemplate"
}
}
],
"tags": [
"WorkflowService"
]
}
},
"/apis/v1beta1/{namespace}/workflows": {
"post": {
"summary": "Creates a Workflow",
"operationId": "Create",
"operationId": "CreateWorkflow",
"responses": {
"200": {
"description": "A successful response.",
@@ -86,6 +118,9 @@
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"manifest": {
"type": "string"
}

View File

@@ -20,9 +20,57 @@ var _ = math.Inf
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type CreateWorkflowTemplateRequest struct {
Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
WorkflowTemplate *WorkflowTemplate `protobuf:"bytes,2,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CreateWorkflowTemplateRequest) Reset() { *m = CreateWorkflowTemplateRequest{} }
func (m *CreateWorkflowTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*CreateWorkflowTemplateRequest) ProtoMessage() {}
func (*CreateWorkflowTemplateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_b9a07547748a96e8, []int{0}
}
func (m *CreateWorkflowTemplateRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateWorkflowTemplateRequest.Unmarshal(m, b)
}
func (m *CreateWorkflowTemplateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CreateWorkflowTemplateRequest.Marshal(b, m, deterministic)
}
func (m *CreateWorkflowTemplateRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_CreateWorkflowTemplateRequest.Merge(m, src)
}
func (m *CreateWorkflowTemplateRequest) XXX_Size() int {
return xxx_messageInfo_CreateWorkflowTemplateRequest.Size(m)
}
func (m *CreateWorkflowTemplateRequest) XXX_DiscardUnknown() {
xxx_messageInfo_CreateWorkflowTemplateRequest.DiscardUnknown(m)
}
var xxx_messageInfo_CreateWorkflowTemplateRequest proto.InternalMessageInfo
func (m *CreateWorkflowTemplateRequest) GetNamespace() string {
if m != nil {
return m.Namespace
}
return ""
}
func (m *CreateWorkflowTemplateRequest) GetWorkflowTemplate() *WorkflowTemplate {
if m != nil {
return m.WorkflowTemplate
}
return nil
}
type WorkflowTemplate struct {
Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
Manifest string `protobuf:"bytes,4,opt,name=manifest,proto3" json:"manifest,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@@ -33,7 +81,7 @@ func (m *WorkflowTemplate) Reset() { *m = WorkflowTemplate{} }
func (m *WorkflowTemplate) String() string { return proto.CompactTextString(m) }
func (*WorkflowTemplate) ProtoMessage() {}
func (*WorkflowTemplate) Descriptor() ([]byte, []int) {
return fileDescriptor_b9a07547748a96e8, []int{0}
return fileDescriptor_b9a07547748a96e8, []int{1}
}
func (m *WorkflowTemplate) XXX_Unmarshal(b []byte) error {
@@ -68,6 +116,13 @@ func (m *WorkflowTemplate) GetName() string {
return ""
}
func (m *WorkflowTemplate) GetVersion() string {
if m != nil {
return m.Version
}
return ""
}
func (m *WorkflowTemplate) GetManifest() string {
if m != nil {
return m.Manifest
@@ -76,19 +131,25 @@ func (m *WorkflowTemplate) GetManifest() string {
}
func init() {
proto.RegisterType((*CreateWorkflowTemplateRequest)(nil), "api.CreateWorkflowTemplateRequest")
proto.RegisterType((*WorkflowTemplate)(nil), "api.WorkflowTemplate")
}
func init() { proto.RegisterFile("workflow_template.proto", fileDescriptor_b9a07547748a96e8) }
var fileDescriptor_b9a07547748a96e8 = []byte{
// 116 bytes of a gzipped FileDescriptorProto
// 193 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2f, 0xcf, 0x2f, 0xca,
0x4e, 0xcb, 0xc9, 0x2f, 0x8f, 0x2f, 0x49, 0xcd, 0x2d, 0xc8, 0x49, 0x2c, 0x49, 0xd5, 0x2b, 0x28,
0xca, 0x2f, 0xc9, 0x17, 0x62, 0x4e, 0x2c, 0xc8, 0x54, 0x0a, 0xe1, 0x12, 0x08, 0x87, 0xca, 0x87,
0x40, 0xa5, 0x85, 0x04, 0xb8, 0x98, 0x4b, 0x33, 0x53, 0x24, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83,
0x40, 0x4c, 0x21, 0x21, 0x2e, 0x96, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x26, 0xb0, 0x10, 0x98, 0x2d,
0x24, 0xc5, 0xc5, 0x91, 0x9b, 0x98, 0x97, 0x99, 0x96, 0x5a, 0x5c, 0x22, 0xc1, 0x02, 0x16, 0x87,
0xf3, 0x93, 0xd8, 0xc0, 0x36, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x43, 0x79, 0x28,
0x7c, 0x00, 0x00, 0x00,
0xca, 0x2f, 0xc9, 0x17, 0x62, 0x4e, 0x2c, 0xc8, 0x54, 0x6a, 0x60, 0xe4, 0x92, 0x75, 0x2e, 0x4a,
0x4d, 0x2c, 0x49, 0x0d, 0x87, 0x2a, 0x0b, 0x81, 0xaa, 0x0a, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e,
0x11, 0x92, 0xe1, 0xe2, 0xcc, 0x4b, 0xcc, 0x4d, 0x2d, 0x2e, 0x48, 0x4c, 0x4e, 0x95, 0x60, 0x54,
0x60, 0xd4, 0xe0, 0x0c, 0x42, 0x08, 0x08, 0x39, 0x72, 0x09, 0x94, 0xa3, 0x69, 0x94, 0x60, 0x52,
0x60, 0xd4, 0xe0, 0x36, 0x12, 0xd5, 0x4b, 0x2c, 0xc8, 0xd4, 0xc3, 0x30, 0x15, 0x43, 0xb9, 0x52,
0x1e, 0x97, 0x00, 0xba, 0x2a, 0x21, 0x01, 0x2e, 0xe6, 0xd2, 0xcc, 0x14, 0xa8, 0x75, 0x20, 0xa6,
0x90, 0x10, 0x17, 0x0b, 0xc8, 0x56, 0xb0, 0xe1, 0x9c, 0x41, 0x60, 0xb6, 0x90, 0x04, 0x17, 0x7b,
0x59, 0x6a, 0x51, 0x71, 0x66, 0x7e, 0x9e, 0x04, 0x33, 0x58, 0x18, 0xc6, 0x15, 0x92, 0xe2, 0xe2,
0xc8, 0x4d, 0xcc, 0xcb, 0x4c, 0x4b, 0x2d, 0x2e, 0x91, 0x60, 0x01, 0x4b, 0xc1, 0xf9, 0x49, 0x6c,
0x60, 0xef, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x01, 0xe2, 0x84, 0xe2, 0x19, 0x01, 0x00,
0x00,
}

View File

@@ -2,9 +2,14 @@ syntax = "proto3";
package api;
message CreateWorkflowTemplateRequest {
string namespace = 1;
WorkflowTemplate workflowTemplate = 2;
}
message WorkflowTemplate {
string uid = 1;
string name = 2;
string version = 3;
string manifest = 4;
}

View File

@@ -4,7 +4,6 @@ CREATE TABLE workflow_templates
id serial PRIMARY KEY,
uid varchar(36) UNIQUE NOT NULL CHECK(uid <> ''),
name text UNIQUE NOT NULL CHECK(name <> ''),
manifest text,
-- auditing info
created_at timestamp NOT NULL DEFAULT (NOW() at time zone 'utc'),

View File

@@ -0,0 +1,15 @@
-- +goose Up
CREATE TABLE workflow_template_versions
(
id serial PRIMARY KEY,
workflow_template_id integer NOT NULL REFERENCES workflow_templates ON DELETE CASCADE,
version timestamp NOT NULL DEFAULT (NOW() at time zone 'utc'),
manifest jsonb NOT NULL,
-- auditing info
created_at timestamp NOT NULL DEFAULT (NOW() at time zone 'utc'),
modified_at timestamp
);
-- +goose Down
DROP TABLE workflow_template_versions;

View File

@@ -6,10 +6,6 @@ import (
)
func (r *ResourceManager) CreateWorkflow(namespace string, workflow *model.Workflow) (createdWorkflow *model.Workflow, err error) {
if err != nil {
return
}
opts := &argo.Options{
Namespace: namespace,
}
@@ -30,3 +26,7 @@ func (r *ResourceManager) CreateWorkflow(namespace string, workflow *model.Workf
return
}
func (r *ResourceManager) CreateWorkflowTemplate(namespace string, workflowTemplate *model.WorkflowTemplate) (createdWorkflowTemplate *model.WorkflowTemplate, err error) {
return r.workflowRepository.CreateWorkflowTemplate(workflowTemplate)
}

View File

@@ -1,5 +1,7 @@
package model
import "github.com/google/uuid"
type WorkflowTemplate struct {
ID uint64
UID string
@@ -10,3 +12,13 @@ type WorkflowTemplate struct {
func (wt *WorkflowTemplate) GetManifest() []byte {
return []byte(wt.Manifest)
}
func (wt *WorkflowTemplate) GenerateUID() (string, error) {
uid, err := uuid.NewRandom()
if err != nil {
return "", err
}
wt.UID = uid.String()
return wt.UID, nil
}

View File

@@ -21,8 +21,8 @@ func (db *DB) BaseConnection() *sql.DB {
return db.DB.DB
}
func (db *DB) NamedQueryWithStructScan(query string, dest interface{}) (err error) {
rows, err := db.NamedQuery(query, dest)
func (db *DB) QueryStructScan(query string, args []interface{}, dest interface{}) (err error) {
rows, err := db.Queryx(query, args)
if err != nil {
return
}

View File

@@ -2,28 +2,35 @@ package repository
import (
sq "github.com/Masterminds/squirrel"
"github.com/onepanelio/core/model"
)
type WorkflowRepository struct {
db *DB
sb sq.StatementBuilderType
}
func NewWorkflowRepository(db *DB) *WorkflowRepository {
return &WorkflowRepository{db: db}
return &WorkflowRepository{db: db, sb: sq.StatementBuilder.PlaceholderFormat(sq.Dollar)}
}
func (w *WorkflowRepository) Create(workflow *model.Workflow) (err error) {
sql, _, err := sq.Insert("workflows").
SetMap(sq.Eq{
"UID": workflow.UID,
}).ToSql()
func (r *WorkflowRepository) CreateWorkflowTemplate(workflowTemplate *model.WorkflowTemplate) (*model.WorkflowTemplate, error) {
uid, err := workflowTemplate.GenerateUID()
if err != nil {
return
return nil, err
}
err = w.db.NamedQueryWithStructScan(sql, workflow)
err = r.sb.Insert("workflow_templates").
SetMap(sq.Eq{
"uid": uid,
"name": workflowTemplate.Name,
}).
Suffix("RETURNING id, uid").
RunWith(r.db.BaseConnection()).
QueryRow().Scan(&workflowTemplate.ID, &workflowTemplate.UID)
if err != nil {
return nil, err
}
return
return workflowTemplate, nil
}

View File

@@ -8,24 +8,23 @@ import (
"github.com/onepanelio/core/model"
)
func TestWorkflowRepositoryCreate(t *testing.T) {
func TestWorkflowRepositoryCreateWorkflowTemplate(t *testing.T) {
uid, err := uuid.NewRandom()
if err != nil {
t.Error(err)
return
}
workflow := &model.Workflow{
workflowTemplate := &model.WorkflowTemplate{
UID: uid.String(),
}
sql, args, err := sq.Insert("workflows").
sql, args, err := sq.Insert("workflow_templates").
SetMap(sq.Eq{
"UID": workflow.UID,
"UID": workflowTemplate.UID,
}).ToSql()
if err != nil {
t.Error(err)
return
}
t.Log(args)
t.Log(sql)
t.Log(sql, args)
}

View File

@@ -17,7 +17,7 @@ func NewWorkflowServer(resourceManager *manager.ResourceManager) *WorkflowServer
return &WorkflowServer{resourceManager: resourceManager}
}
func (w *WorkflowServer) Create(ctx context.Context, req *api.CreateWorkflowRequest) (*api.Workflow, error) {
func (s *WorkflowServer) CreateWorkflow(ctx context.Context, req *api.CreateWorkflowRequest) (*api.Workflow, error) {
workflow := &model.Workflow{
WorkflowTemplate: model.WorkflowTemplate{
Manifest: req.Workflow.WorkflowTemplate.Manifest,
@@ -30,7 +30,7 @@ func (w *WorkflowServer) Create(ctx context.Context, req *api.CreateWorkflowRequ
})
}
createdWorkflow, err := w.resourceManager.CreateWorkflow(req.Namespace, workflow)
createdWorkflow, err := s.resourceManager.CreateWorkflow(req.Namespace, workflow)
if err != nil {
return nil, err
}
@@ -41,3 +41,16 @@ func (w *WorkflowServer) Create(ctx context.Context, req *api.CreateWorkflowRequ
return req.Workflow, nil
}
func (s *WorkflowServer) CreateWorkflowTemplate(ctx context.Context, req *api.CreateWorkflowTemplateRequest) (*api.WorkflowTemplate, error) {
workflowTemplate := &model.WorkflowTemplate{
Name: req.WorkflowTemplate.Name,
}
workflowTemplate, err := s.resourceManager.CreateWorkflowTemplate(req.Namespace, workflowTemplate)
if err != nil {
return nil, err
}
req.WorkflowTemplate.Uid = workflowTemplate.UID
return req.WorkflowTemplate, nil
}