3
0

Refactor corredor service, add supprot for iterators

This commit is contained in:
Denis Arh
2020-03-26 15:27:24 +01:00
parent 2767bbb38a
commit 33721bf870
3 changed files with 397 additions and 116 deletions
+144 -50
View File
@@ -398,6 +398,7 @@ type ServerScript struct {
UpdatedAt string `protobuf:"bytes,12,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"`
Security *Security `protobuf:"bytes,13,opt,name=security,proto3" json:"security,omitempty"`
Triggers []*Trigger `protobuf:"bytes,14,rep,name=triggers,proto3" json:"triggers,omitempty"`
Iterator *Iterator `protobuf:"bytes,11,opt,name=iterator,proto3" json:"iterator,omitempty"`
Errors []string `protobuf:"bytes,15,rep,name=errors,proto3" json:"errors,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@@ -471,6 +472,13 @@ func (m *ServerScript) GetTriggers() []*Trigger {
return nil
}
func (m *ServerScript) GetIterator() *Iterator {
if m != nil {
return m.Iterator
}
return nil
}
func (m *ServerScript) GetErrors() []string {
if m != nil {
return m.Errors
@@ -699,6 +707,85 @@ func (m *Trigger) GetConstraints() []*TConstraint {
return nil
}
type Iterator struct {
EventType string `protobuf:"bytes,1,opt,name=eventType,proto3" json:"eventType,omitempty"`
ResourceType string `protobuf:"bytes,2,opt,name=resourceType,proto3" json:"resourceType,omitempty"`
Deferred []string `protobuf:"bytes,3,rep,name=deferred,proto3" json:"deferred,omitempty"`
Filter map[string]string `protobuf:"bytes,4,rep,name=filter,proto3" json:"filter,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Action string `protobuf:"bytes,5,opt,name=action,proto3" json:"action,omitempty"`
UiProps []*TUIProp `protobuf:"bytes,14,rep,name=uiProps,proto3" json:"uiProps,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Iterator) Reset() { *m = Iterator{} }
func (m *Iterator) String() string { return proto.CompactTextString(m) }
func (*Iterator) ProtoMessage() {}
func (*Iterator) Descriptor() ([]byte, []int) {
return fileDescriptor_c06bb92bf45e37e2, []int{12}
}
func (m *Iterator) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Iterator.Unmarshal(m, b)
}
func (m *Iterator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Iterator.Marshal(b, m, deterministic)
}
func (m *Iterator) XXX_Merge(src proto.Message) {
xxx_messageInfo_Iterator.Merge(m, src)
}
func (m *Iterator) XXX_Size() int {
return xxx_messageInfo_Iterator.Size(m)
}
func (m *Iterator) XXX_DiscardUnknown() {
xxx_messageInfo_Iterator.DiscardUnknown(m)
}
var xxx_messageInfo_Iterator proto.InternalMessageInfo
func (m *Iterator) GetEventType() string {
if m != nil {
return m.EventType
}
return ""
}
func (m *Iterator) GetResourceType() string {
if m != nil {
return m.ResourceType
}
return ""
}
func (m *Iterator) GetDeferred() []string {
if m != nil {
return m.Deferred
}
return nil
}
func (m *Iterator) GetFilter() map[string]string {
if m != nil {
return m.Filter
}
return nil
}
func (m *Iterator) GetAction() string {
if m != nil {
return m.Action
}
return ""
}
func (m *Iterator) GetUiProps() []*TUIProp {
if m != nil {
return m.UiProps
}
return nil
}
type TConstraint struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Op string `protobuf:"bytes,2,opt,name=op,proto3" json:"op,omitempty"`
@@ -712,7 +799,7 @@ func (m *TConstraint) Reset() { *m = TConstraint{} }
func (m *TConstraint) String() string { return proto.CompactTextString(m) }
func (*TConstraint) ProtoMessage() {}
func (*TConstraint) Descriptor() ([]byte, []int) {
return fileDescriptor_c06bb92bf45e37e2, []int{12}
return fileDescriptor_c06bb92bf45e37e2, []int{13}
}
func (m *TConstraint) XXX_Unmarshal(b []byte) error {
@@ -766,7 +853,7 @@ func (m *TUIProp) Reset() { *m = TUIProp{} }
func (m *TUIProp) String() string { return proto.CompactTextString(m) }
func (*TUIProp) ProtoMessage() {}
func (*TUIProp) Descriptor() ([]byte, []int) {
return fileDescriptor_c06bb92bf45e37e2, []int{13}
return fileDescriptor_c06bb92bf45e37e2, []int{14}
}
func (m *TUIProp) XXX_Unmarshal(b []byte) error {
@@ -814,7 +901,7 @@ func (m *Bundle) Reset() { *m = Bundle{} }
func (m *Bundle) String() string { return proto.CompactTextString(m) }
func (*Bundle) ProtoMessage() {}
func (*Bundle) Descriptor() ([]byte, []int) {
return fileDescriptor_c06bb92bf45e37e2, []int{14}
return fileDescriptor_c06bb92bf45e37e2, []int{15}
}
func (m *Bundle) XXX_Unmarshal(b []byte) error {
@@ -871,6 +958,8 @@ func init() {
proto.RegisterType((*ClientScript)(nil), "corredor.ClientScript")
proto.RegisterType((*Security)(nil), "corredor.Security")
proto.RegisterType((*Trigger)(nil), "corredor.Trigger")
proto.RegisterType((*Iterator)(nil), "corredor.Iterator")
proto.RegisterMapType((map[string]string)(nil), "corredor.Iterator.FilterEntry")
proto.RegisterType((*TConstraint)(nil), "corredor.TConstraint")
proto.RegisterType((*TUIProp)(nil), "corredor.TUIProp")
proto.RegisterType((*Bundle)(nil), "corredor.Bundle")
@@ -879,53 +968,58 @@ func init() {
func init() { proto.RegisterFile("service-corredor.proto", fileDescriptor_c06bb92bf45e37e2) }
var fileDescriptor_c06bb92bf45e37e2 = []byte{
// 725 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcd, 0x6e, 0xd3, 0x4e,
0x10, 0x97, 0x93, 0x34, 0x1f, 0xe3, 0xa4, 0xff, 0xfe, 0x57, 0x6d, 0x6a, 0x45, 0x08, 0xc2, 0xc2,
0x21, 0x02, 0x35, 0x42, 0xa9, 0x50, 0xa1, 0x70, 0x69, 0x4b, 0x85, 0x40, 0x45, 0x42, 0x6e, 0x79,
0x00, 0xd7, 0x1e, 0x45, 0x16, 0xc6, 0xeb, 0xee, 0xae, 0x03, 0x79, 0x00, 0x4e, 0x1c, 0x38, 0x71,
0xea, 0x73, 0xf0, 0x5c, 0xbc, 0x02, 0xf2, 0x7a, 0xed, 0x6c, 0xeb, 0xa4, 0x02, 0x09, 0x21, 0x6e,
0xf3, 0xf1, 0x9b, 0x4f, 0xcf, 0xcc, 0x1a, 0xfa, 0x02, 0xf9, 0x2c, 0xf4, 0x71, 0xc7, 0x67, 0x9c,
0x63, 0xc0, 0xf8, 0x38, 0xe1, 0x4c, 0x32, 0xd2, 0x2e, 0x78, 0xfa, 0xd5, 0x02, 0xfb, 0xf8, 0x13,
0xfa, 0x2e, 0x5e, 0xa4, 0x28, 0x24, 0x21, 0xd0, 0x88, 0xbd, 0x0f, 0xe8, 0x58, 0x43, 0x6b, 0xd4,
0x71, 0x15, 0x4d, 0x76, 0xa1, 0xe1, 0xf1, 0xa9, 0x70, 0x6a, 0xc3, 0xfa, 0xc8, 0x9e, 0xdc, 0x19,
0x97, 0xce, 0x0c, 0xc3, 0xf1, 0x01, 0x9f, 0x8a, 0xe3, 0x58, 0xf2, 0xb9, 0xab, 0xc0, 0x83, 0x3d,
0xe8, 0x94, 0x22, 0xb2, 0x01, 0xf5, 0xf7, 0x38, 0xd7, 0x4e, 0x33, 0x92, 0x6c, 0xc2, 0xda, 0xcc,
0x8b, 0x52, 0x74, 0x6a, 0x4a, 0x96, 0x33, 0xfb, 0xb5, 0x27, 0x16, 0xfd, 0x6c, 0x41, 0x37, 0x77,
0x2c, 0x12, 0x16, 0x0b, 0x24, 0xfb, 0xd0, 0xe4, 0x28, 0xd2, 0x48, 0xea, 0x04, 0xe8, 0xf5, 0x04,
0x72, 0xdc, 0xd8, 0x55, 0xa0, 0x3c, 0x07, 0x6d, 0x31, 0x78, 0x0a, 0xb6, 0x21, 0xfe, 0xad, 0x3c,
0x04, 0x6c, 0x9f, 0x22, 0x9f, 0x21, 0x3f, 0xf5, 0x79, 0x98, 0xc8, 0x93, 0x50, 0xc8, 0xa2, 0x49,
0x9b, 0xb0, 0x76, 0x91, 0x22, 0x2f, 0x1c, 0xe5, 0x0c, 0xa1, 0xd0, 0xe5, 0x28, 0x58, 0xca, 0x7d,
0x3c, 0x9b, 0x27, 0x85, 0xc7, 0x2b, 0x32, 0x72, 0x1b, 0x00, 0x67, 0x18, 0xcb, 0x8c, 0x11, 0x4e,
0x7d, 0x58, 0x1f, 0x75, 0x5c, 0x43, 0x42, 0x4f, 0xc0, 0xa9, 0x06, 0xd5, 0x7d, 0x78, 0x04, 0x2d,
0xa1, 0xa4, 0xc2, 0xb1, 0x54, 0x23, 0xfa, 0x8b, 0x46, 0x98, 0x46, 0x6e, 0x01, 0xa3, 0x5f, 0x2c,
0xd8, 0x3e, 0x8a, 0x42, 0x8c, 0xe5, 0x5f, 0xac, 0x81, 0xf4, 0xa1, 0x79, 0x9e, 0xc6, 0x41, 0x84,
0x4e, 0x43, 0x59, 0x6b, 0x2e, 0xab, 0xad, 0x9a, 0xcc, 0x2f, 0xd4, 0x66, 0x1a, 0x2d, 0x6a, 0xbb,
0x07, 0xbd, 0x43, 0xe5, 0xf7, 0x86, 0xc9, 0xa5, 0xcf, 0x61, 0xbd, 0x00, 0xe9, 0x40, 0x0f, 0xa0,
0x95, 0xa7, 0x53, 0x04, 0xda, 0x58, 0x04, 0xd2, 0xd0, 0x02, 0x40, 0x7f, 0x58, 0xd0, 0x35, 0x1b,
0xbb, 0x74, 0x39, 0x36, 0x61, 0x2d, 0xf2, 0xce, 0x31, 0x2a, 0x06, 0x48, 0x31, 0x64, 0x08, 0x76,
0x80, 0x79, 0xaa, 0x21, 0x8b, 0x9d, 0xba, 0xd2, 0x99, 0x22, 0x72, 0x0b, 0x3a, 0x69, 0x12, 0x78,
0x12, 0x83, 0x03, 0xe9, 0x74, 0x95, 0x7e, 0x21, 0x20, 0x63, 0x68, 0x0b, 0xf4, 0x53, 0x1e, 0xca,
0xb9, 0xd3, 0x1b, 0x5a, 0x23, 0x7b, 0x42, 0xcc, 0x8f, 0x9d, 0x6b, 0xdc, 0x12, 0x43, 0x76, 0xa0,
0x2d, 0x79, 0x38, 0x9d, 0x22, 0x17, 0xce, 0xba, 0xaa, 0xeb, 0xff, 0x05, 0xfe, 0x2c, 0xd7, 0xb8,
0x25, 0x24, 0xfb, 0x44, 0xc8, 0x39, 0xe3, 0xc2, 0xf9, 0x4f, 0x7d, 0x3e, 0xcd, 0xd1, 0xcb, 0x1a,
0x74, 0xcd, 0x76, 0xff, 0xd1, 0x8a, 0x57, 0xcc, 0x45, 0x16, 0x43, 0x66, 0xb3, 0xd6, 0xcc, 0x63,
0x64, 0xf4, 0xbf, 0xd9, 0x9d, 0xd7, 0xd0, 0x2e, 0x9c, 0x67, 0x4d, 0xe0, 0x69, 0x7c, 0x20, 0x8a,
0xf5, 0x51, 0x4c, 0x56, 0x4a, 0x80, 0xf1, 0x5c, 0x1d, 0xaa, 0x8e, 0xab, 0xe8, 0x0c, 0xe9, 0x45,
0x11, 0xfb, 0xa8, 0x37, 0x25, 0x67, 0xe8, 0x77, 0x0b, 0x5a, 0x3a, 0xf2, 0xb5, 0x85, 0xb2, 0x2a,
0x0b, 0x75, 0x1f, 0x7a, 0xe6, 0x02, 0x0a, 0xed, 0xfe, 0xaa, 0x90, 0x3c, 0x84, 0x56, 0x1a, 0xbe,
0xe5, 0x2c, 0x59, 0x56, 0xe3, 0xbb, 0x57, 0x99, 0xc6, 0x2d, 0x10, 0x64, 0x0f, 0x6c, 0x9f, 0xc5,
0x42, 0x72, 0x2f, 0x8c, 0x65, 0x5e, 0xa7, 0x3d, 0xd9, 0x32, 0x0c, 0x8e, 0x4a, 0xad, 0x6b, 0x22,
0xe9, 0x4b, 0xb0, 0x0d, 0xdd, 0xd2, 0xf9, 0x58, 0x87, 0x1a, 0x4b, 0xf4, 0x70, 0xd4, 0x58, 0xb2,
0x38, 0xb1, 0xba, 0x01, 0x8a, 0xa1, 0xbb, 0xd0, 0xd2, 0x59, 0xad, 0x1a, 0xb2, 0xea, 0x5d, 0xa6,
0x2f, 0xa0, 0x79, 0x58, 0x0e, 0x4d, 0xc5, 0xa6, 0x18, 0xa4, 0x9a, 0x31, 0x48, 0x04, 0x1a, 0x3e,
0x0b, 0x50, 0xcf, 0xa3, 0xa2, 0x27, 0xdf, 0x2c, 0xe8, 0x99, 0x7b, 0x2d, 0xc8, 0x63, 0x68, 0x64,
0x4f, 0x09, 0xd9, 0x5a, 0xfa, 0xb6, 0x0d, 0xfa, 0xcb, 0x5f, 0x1c, 0xf2, 0x06, 0x1a, 0xd9, 0x15,
0x23, 0x77, 0x97, 0x1f, 0x62, 0xe3, 0xdc, 0x0e, 0xe8, 0x4d, 0x90, 0xdc, 0xdd, 0xe4, 0xd2, 0x82,
0x9e, 0xb9, 0x7d, 0x82, 0x3c, 0x2b, 0xeb, 0xdd, 0xae, 0x9c, 0x29, 0xed, 0xd8, 0xa9, 0x2a, 0x56,
0x67, 0xb7, 0xe2, 0x31, 0x30, 0xb3, 0x5b, 0x75, 0xa2, 0x27, 0x1d, 0x68, 0x9d, 0x4a, 0xc6, 0xbd,
0x29, 0x9e, 0x37, 0xd5, 0x5f, 0xc4, 0xee, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x7e, 0x48,
0x92, 0x5f, 0x08, 0x00, 0x00,
// 813 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4f, 0x6f, 0xeb, 0x44,
0x10, 0x97, 0x9d, 0xff, 0xe3, 0xa4, 0x3c, 0x56, 0x7d, 0xa9, 0x15, 0xa1, 0x47, 0x30, 0x1c, 0x22,
0xd0, 0x8b, 0x50, 0x2a, 0x78, 0x50, 0xb8, 0xb4, 0xa5, 0xa0, 0xa2, 0x22, 0x21, 0xb7, 0x7c, 0x00,
0xd7, 0x9e, 0x46, 0x16, 0xc6, 0xeb, 0xee, 0xae, 0x03, 0xf9, 0x00, 0x9c, 0x38, 0x70, 0xe2, 0xd4,
0x03, 0x7c, 0x09, 0xbe, 0x1f, 0xda, 0x3f, 0x76, 0xb6, 0x75, 0x52, 0xb5, 0x12, 0x82, 0xdb, 0xce,
0xcc, 0x6f, 0xfe, 0xee, 0xcc, 0xce, 0xc2, 0x98, 0x23, 0x5b, 0xa5, 0x31, 0xbe, 0x8e, 0x29, 0x63,
0x98, 0x50, 0x36, 0x2f, 0x18, 0x15, 0x94, 0xf4, 0x2b, 0x3a, 0xf8, 0xdd, 0x01, 0xef, 0xec, 0x17,
0x8c, 0x43, 0xbc, 0x2d, 0x91, 0x0b, 0x42, 0xa0, 0x9d, 0x47, 0x3f, 0xa1, 0xef, 0x4c, 0x9d, 0xd9,
0x20, 0x54, 0x67, 0x72, 0x08, 0xed, 0x88, 0x2d, 0xb9, 0xef, 0x4e, 0x5b, 0x33, 0x6f, 0xf1, 0xee,
0xbc, 0x36, 0x66, 0x29, 0xce, 0x8f, 0xd9, 0x92, 0x9f, 0xe5, 0x82, 0xad, 0x43, 0x05, 0x9e, 0xbc,
0x81, 0x41, 0xcd, 0x22, 0x2f, 0xa0, 0xf5, 0x23, 0xae, 0x8d, 0x51, 0x79, 0x24, 0xfb, 0xd0, 0x59,
0x45, 0x59, 0x89, 0xbe, 0xab, 0x78, 0x9a, 0x38, 0x72, 0x3f, 0x73, 0x82, 0x5f, 0x1d, 0x18, 0x6a,
0xc3, 0xbc, 0xa0, 0x39, 0x47, 0x72, 0x04, 0x5d, 0x86, 0xbc, 0xcc, 0x84, 0x09, 0x20, 0x78, 0x18,
0x80, 0xc6, 0xcd, 0x43, 0x05, 0xd2, 0x31, 0x18, 0x8d, 0xc9, 0xe7, 0xe0, 0x59, 0xec, 0x67, 0xc5,
0xc1, 0xe1, 0xe0, 0x12, 0xd9, 0x0a, 0xd9, 0x65, 0xcc, 0xd2, 0x42, 0x5c, 0xa4, 0x5c, 0x54, 0x45,
0xda, 0x87, 0xce, 0x6d, 0x89, 0xac, 0x32, 0xa4, 0x09, 0x12, 0xc0, 0x90, 0x21, 0xa7, 0x25, 0x8b,
0xf1, 0x6a, 0x5d, 0x54, 0x16, 0xef, 0xf1, 0xc8, 0x2b, 0x00, 0x5c, 0x61, 0x2e, 0x24, 0xc1, 0xfd,
0xd6, 0xb4, 0x35, 0x1b, 0x84, 0x16, 0x27, 0xb8, 0x00, 0xbf, 0xe9, 0xd4, 0xd4, 0xe1, 0x63, 0xe8,
0x71, 0xc5, 0xe5, 0xbe, 0xa3, 0x0a, 0x31, 0xde, 0x14, 0xc2, 0x56, 0x0a, 0x2b, 0x58, 0xf0, 0x9b,
0x03, 0x07, 0xa7, 0x59, 0x8a, 0xb9, 0xf8, 0x0f, 0x73, 0x20, 0x63, 0xe8, 0x5e, 0x97, 0x79, 0x92,
0xa1, 0xdf, 0x56, 0xda, 0x86, 0x92, 0xb9, 0x35, 0x83, 0x79, 0x42, 0x6e, 0xb6, 0xd2, 0x26, 0xb7,
0xf7, 0x61, 0x74, 0xa2, 0xec, 0x3e, 0xd2, 0xb9, 0xc1, 0x97, 0xb0, 0x57, 0x81, 0x8c, 0xa3, 0x0f,
0xa1, 0xa7, 0xc3, 0xa9, 0x1c, 0xbd, 0xd8, 0x38, 0x32, 0xd0, 0x0a, 0x10, 0xfc, 0xe9, 0xc2, 0xd0,
0x2e, 0xec, 0xd6, 0xe1, 0xd8, 0x87, 0x4e, 0x16, 0x5d, 0x63, 0x56, 0x35, 0x90, 0x22, 0xc8, 0x14,
0xbc, 0x04, 0x75, 0xa8, 0x29, 0xcd, 0xfd, 0x96, 0x92, 0xd9, 0x2c, 0xf2, 0x0e, 0x0c, 0xca, 0x22,
0x89, 0x04, 0x26, 0xc7, 0xc2, 0x1f, 0x2a, 0xf9, 0x86, 0x41, 0xe6, 0xd0, 0xe7, 0x18, 0x97, 0x2c,
0x15, 0x6b, 0x7f, 0x34, 0x75, 0x66, 0xde, 0x82, 0xd8, 0x97, 0xad, 0x25, 0x61, 0x8d, 0x21, 0xaf,
0xa1, 0x2f, 0x58, 0xba, 0x5c, 0x22, 0xe3, 0xfe, 0x9e, 0xca, 0xeb, 0xed, 0x0d, 0xfe, 0x4a, 0x4b,
0xc2, 0x1a, 0x22, 0xcd, 0xa7, 0x02, 0x59, 0x24, 0x28, 0xf3, 0xbd, 0x87, 0xe6, 0xcf, 0x8d, 0x24,
0xac, 0x31, 0xf2, 0x4a, 0x91, 0x31, 0xca, 0xb8, 0xff, 0x96, 0xba, 0x6e, 0x43, 0x05, 0x77, 0x2e,
0x0c, 0xed, 0xeb, 0xf9, 0x57, 0x2b, 0xb4, 0xa3, 0x8f, 0xa4, 0x0f, 0x21, 0x7b, 0xb3, 0xab, 0x7d,
0xc8, 0xf3, 0xff, 0x5b, 0xcd, 0x5d, 0xd5, 0xf9, 0x16, 0xfa, 0x95, 0x71, 0x59, 0x04, 0x56, 0xe6,
0xc7, 0xbc, 0x1a, 0x37, 0x45, 0xc8, 0x54, 0x12, 0xcc, 0xd7, 0xea, 0x61, 0x1b, 0x84, 0xea, 0x2c,
0x91, 0x51, 0x96, 0xd1, 0x9f, 0xcd, 0x64, 0x69, 0x22, 0xf8, 0xdb, 0x81, 0x9e, 0xf1, 0xfc, 0x60,
0x00, 0x9d, 0xc6, 0x00, 0x7e, 0x00, 0x23, 0x7b, 0x60, 0xb9, 0x31, 0x7f, 0x9f, 0x49, 0x3e, 0x82,
0x5e, 0x99, 0x7e, 0xcf, 0x68, 0xb1, 0x2d, 0xc7, 0x1f, 0xce, 0xa5, 0x24, 0xac, 0x10, 0xe4, 0x0d,
0x78, 0x31, 0xcd, 0xb9, 0x60, 0x51, 0x9a, 0x0b, 0x9d, 0xa7, 0xb7, 0x78, 0x69, 0x29, 0x9c, 0xd6,
0xd2, 0xd0, 0x46, 0x06, 0x7f, 0xb9, 0xd0, 0xaf, 0x1a, 0x4a, 0xde, 0x52, 0x1d, 0xa6, 0x29, 0xc4,
0x86, 0xf1, 0xa4, 0xb7, 0x67, 0x02, 0xfd, 0x04, 0x6f, 0x50, 0x7a, 0x35, 0xf5, 0xa9, 0x69, 0xf2,
0x29, 0x74, 0x6f, 0xd2, 0x4c, 0x20, 0xf3, 0xdb, 0x2a, 0xbc, 0x57, 0xcd, 0x96, 0x9e, 0x7f, 0xad,
0x00, 0x66, 0x47, 0x68, 0xb4, 0xbc, 0xbe, 0x28, 0x56, 0x4d, 0xd8, 0xd1, 0x7d, 0xa6, 0xa9, 0x67,
0x15, 0x48, 0x2e, 0x1a, 0xcb, 0xf6, 0xb3, 0x16, 0xcd, 0x37, 0xe0, 0x59, 0xe5, 0xdb, 0x3a, 0x42,
0x7b, 0xe0, 0xd2, 0xc2, 0x68, 0xba, 0xb4, 0xd8, 0x18, 0x33, 0x3d, 0xa2, 0x88, 0xe0, 0x10, 0x7a,
0x26, 0xae, 0x5d, 0x73, 0xd8, 0x8c, 0x20, 0xf8, 0x0a, 0xba, 0x27, 0xf5, 0x5c, 0x35, 0x74, 0xaa,
0x59, 0x73, 0xad, 0x59, 0x23, 0xd0, 0x8e, 0x69, 0x82, 0x66, 0x64, 0xd5, 0x79, 0xf1, 0x87, 0x03,
0x23, 0xfb, 0xa9, 0xe4, 0xe4, 0x13, 0x68, 0xcb, 0xed, 0x4c, 0x5e, 0x6e, 0xfd, 0x2e, 0x4c, 0xc6,
0xdb, 0x97, 0x38, 0xf9, 0x0e, 0xda, 0x72, 0x31, 0x90, 0xf7, 0xb6, 0xef, 0x36, 0x6b, 0x83, 0x4d,
0x82, 0xc7, 0x20, 0xda, 0xdc, 0xe2, 0xce, 0x81, 0x91, 0xfd, 0x40, 0x71, 0xf2, 0x45, 0x9d, 0xef,
0x41, 0xe3, 0xe5, 0x37, 0x86, 0xfd, 0xa6, 0x60, 0x77, 0x74, 0x3b, 0xf6, 0xab, 0x1d, 0xdd, 0xae,
0xad, 0xb7, 0x18, 0x40, 0xef, 0x52, 0x50, 0x16, 0x2d, 0xf1, 0xba, 0xab, 0x3e, 0x66, 0x87, 0xff,
0x04, 0x00, 0x00, 0xff, 0xff, 0xb5, 0xf8, 0x81, 0x52, 0xb2, 0x09, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
+252 -66
View File
@@ -10,6 +10,7 @@ import (
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
"strings"
"time"
"github.com/cortezaproject/corteza-server/pkg/app/options"
@@ -20,6 +21,10 @@ import (
)
type (
// IteratorResourceFinder acts as a middleware that converts
// iteration request to appropriate resource iterator (eg: Record Finder)
IteratorResourceFinder func(ctx context.Context, f map[string]string, h eventbus.HandlerFn, action string) error
service struct {
// stores corredor connection options
// for when we're doing lazy setup
@@ -49,6 +54,9 @@ type (
eventRegistry eventRegistry
authTokenMaker authTokenMaker
// map[resource-type]
iteratorProviders map[string]IteratorResourceFinder
// Services to help with script security
// we'll find users (runAs) and roles (allow, deny) for
users userFinder
@@ -74,6 +82,10 @@ type (
Unregister(ptrs ...uintptr)
}
iteratorRegistry interface {
Exec(ctx context.Context, resourceType string, f map[string]string, action string) error
}
userFinder interface {
FindByAny(interface{}) (*types.User, error)
}
@@ -91,11 +103,33 @@ type (
}
)
const onManualEventType = "onManual"
const (
onManualEventType = "onManual"
onIterationEventType = "onIteration"
onIntervalEventType = "onInterval"
onTimestampEventType = "onTimestamp"
)
var (
// Global corredor service
gCorredor *service
// List of event types that can be used as iteration
// initiator
//
// These events will fetch resources from registered services
// according to the given filter and call accompanying script
// for each
iteratorCompatibleEventTypes = map[string]bool{
onManualEventType: true,
onIntervalEventType: true,
onTimestampEventType: true,
}
explicitEventTypes = []string{
onManualEventType,
onIterationEventType,
}
)
const (
@@ -106,7 +140,7 @@ func Service() *service {
return gCorredor
}
// Start connects to Corredor & initialize service
// Setup start connects to Corredor & initialize service
func Setup(logger *zap.Logger, opt options.CorredorOpt) (err error) {
if gCorredor != nil {
// Prevent multiple initializations
@@ -125,6 +159,8 @@ func NewService(logger *zap.Logger, opt options.CorredorOpt) *service {
registered: make(map[string][]uintptr),
explicit: make(map[string]map[string]bool),
iteratorProviders: make(map[string]IteratorResourceFinder),
authTokenMaker: auth.DefaultJwtHandler,
eventRegistry: eventbus.Service(),
permissions: permissions.RuleSet{},
@@ -239,6 +275,64 @@ func (svc service) makeScriptFilter(ctx context.Context, f Filter) func(s *Scrip
}
}
func (svc service) ExecIterator(ctx context.Context, scriptName string) error {
var (
script *Script
runAs string
)
if script = svc.sScripts.FindByName(scriptName); script == nil {
return errors.Errorf("nonexistent script (%q)", scriptName)
}
if !svc.canExec(ctx, scriptName) {
return errors.Errorf("permission to execute %s denied", scriptName)
}
if script.Iterator == nil {
return errors.Errorf("not an itrator script")
}
if finder, ok := svc.iteratorProviders[script.Iterator.ResourceType]; !ok {
return errors.Errorf("unknown resource finder: %s", script.Iterator.ResourceType)
} else {
if script.Security != nil {
runAs = script.Security.RunAs
}
if runAs != "" {
if !svc.opt.RunAsEnabled {
return errors.New("could not make runner context, run-as disabled")
}
// Run this iterator as defined user
definer, err := svc.users.FindByAny(runAs)
if err != nil {
return err
}
ctx = auth.SetIdentityToContext(ctx, definer)
}
return finder(
ctx,
script.Iterator.Filter,
func(ctx context.Context, ev eventbus.Event) error {
// iteration handler/callback
//
// this function is called on every iteration, for
// every resource found by iterator
return svc.exec(ctx, scriptName, runAs, ev.(ScriptArgs))
},
script.Iterator.Action,
)
}
}
func (svc *service) RegisterIteratorProvider(resourceType string, irf IteratorResourceFinder) {
svc.iteratorProviders[resourceType] = irf
}
// Exec verifies permissions, event and script and sends exec request to corredor
func (svc service) Exec(ctx context.Context, scriptName string, args ScriptArgs) (err error) {
if !svc.opt.Enabled {
@@ -324,30 +418,6 @@ func (svc *service) loadServerScripts(ctx context.Context) {
// Registers Corredor scripts to eventbus and list of manual scripts
func (svc *service) registerServerScripts(ss ...*ServerScript) {
var (
permRuleGenerator = func(script string, access permissions.Access, roles ...string) (permissions.RuleSet, error) {
out := make([]*permissions.Rule, len(roles))
for i, role := range roles {
if r, err := svc.roles.FindByAny(role); err != nil {
return nil, err
} else {
out[i] = &permissions.Rule{
RoleID: r.ID,
Resource: permissions.Resource(script),
Operation: permOpExec,
Access: access,
}
}
}
return out, nil
}
u *types.User
err error
runAs = ""
)
svc.sScripts = make([]*Script, 0, len(ss))
// Remove all previously registered triggers
@@ -365,13 +435,6 @@ func (svc *service) registerServerScripts(ss ...*ServerScript) {
svc.permissions = permissions.RuleSet{}
for _, script := range ss {
var (
// collectors for allow&deny rules
// we'll merge
allow = permissions.RuleSet{}
deny = permissions.RuleSet{}
)
if nil != svc.sScripts.FindByName(script.Name) {
// Do not allow duplicated scripts
continue
@@ -383,44 +446,36 @@ func (svc *service) registerServerScripts(ss ...*ServerScript) {
Description: script.Description,
Errors: script.Errors,
Triggers: script.Triggers,
Security: &ScriptSecurity{Security: script.Security},
Iterator: script.Iterator,
}
scriptErrPush := func(err error, msg string) {
s.Errors = append(s.Errors, errors.Wrap(err, msg).Error())
// Corredor can (by design) serve us script with errors (load, parse time) and
// they need to be ignored by security, trigger, iterator handlers
if len(s.Errors) == 0 {
if sec, rr, err := svc.serverScriptSecurity(script); err != nil {
s.Errors = append(s.Errors, err.Error())
} else {
s.Security = sec
svc.permissions = append(svc.permissions, rr...)
}
if s.Iterator != nil {
// process iterator and register (deferred) event handlers
if ptrs, err := svc.processIterator(s); err != nil {
s.Errors = append(s.Errors, err.Error())
} else if ptrs > 0 {
svc.registered[script.Name] = []uintptr{ptrs}
}
} else {
if manual := mapExplicitTriggers(script); len(manual) > 0 {
svc.explicit[script.Name] = manual
}
svc.registered[script.Name] = svc.registerTriggers(script)
}
}
if len(s.Errors) == 0 {
if manual := mapExplicitTriggers(script); len(manual) > 0 {
if script.Security != nil {
runAs = script.Security.RunAs
if runAs != "" {
// Prefetch run-as user
if u, err = svc.users.FindByAny(runAs); err != nil {
scriptErrPush(err, "could not load run-as user security info")
} else {
s.Security.runAs = u.ID
}
}
if allow, err = permRuleGenerator(script.Name, permissions.Allow, script.Security.Allow...); err != nil {
scriptErrPush(err, "could not load allow role security info")
}
if deny, err = permRuleGenerator(script.Name, permissions.Deny, script.Security.Deny...); err != nil {
scriptErrPush(err, "could not load deny role security info")
}
svc.permissions = append(svc.permissions, allow...)
svc.permissions = append(svc.permissions, deny...)
}
svc.explicit[script.Name] = manual
}
svc.registered[script.Name] = svc.registerTriggers(script)
svc.log.Debug(
"script registered",
zap.String("script", s.Name),
@@ -434,9 +489,82 @@ func (svc *service) registerServerScripts(ss ...*ServerScript) {
zap.Strings("errors", s.Errors),
)
}
// Even if there are errors, we'll append the scripts
// because we need to serve them as a list for script management
svc.sScripts = append(svc.sScripts, s)
}
}
// Registers scheduled and manual iterators
//
// scheduled iterators
// registered on eventbus as onInterval or onTimestamp
// and triggered by/from scheduler
//
// manual iterators
// can be invoked via API
func (svc *service) processIterator(script *Script) (ptr uintptr, err error) {
var (
log = svc.log.With(zap.String("script", script.Name))
i = script.Iterator
service string
)
if i == nil {
return
}
if i.ResourceType == "" {
return 0, errors.Errorf("iterator resourceType not defined")
}
log.Info(
"registering iterator",
zap.String("action", i.Action),
zap.Any("filter", i.Filter),
zap.String("eventType", i.EventType),
zap.String("resourceType", i.ResourceType),
zap.Strings("deferred", i.Deferred),
)
switch i.EventType {
case onManualEventType:
// nothing special here with manual iterators...
return
case onIntervalEventType, onTimestampEventType:
if len(i.Deferred) == 0 {
return 0, errors.Errorf("missing specification for interval/timestamp events")
}
if script.Security == nil {
return 0, errors.Errorf("can not schedule iterator without security descriptor")
}
if p := strings.Index(i.ResourceType, ":"); p > 0 {
service = i.ResourceType[0:p]
} else {
service = i.ResourceType
}
// Generate event handler for onInterval or onTimestamp event
// with deferred param as constraint
return svc.eventRegistry.Register(
func(ctx context.Context, ev eventbus.Event) error {
return svc.ExecIterator(ctx, script.Name)
},
eventbus.On(i.EventType),
eventbus.For(service),
eventbus.Constraint(eventbus.MustMakeConstraint("", "", i.Deferred...)),
), nil
default:
return 0, errors.Errorf("incompatible event type (%s) for iterator", i.EventType)
}
return
}
// Creates handler function for eventbus subsystem
func (svc *service) registerTriggers(script *ServerScript) []uintptr {
var (
@@ -719,6 +847,64 @@ func (svc *service) registerClientScripts(ss ...*ClientScript) {
}
}
// processes server script security definition
//
// Checks and preloads sser and roles (if defined)
//
func (svc *service) serverScriptSecurity(script *ServerScript) (sec *ScriptSecurity, rr permissions.RuleSet, err error) {
if script.Security == nil {
return
}
var (
// collectors for allow&deny rules
// we'll merge
allow = permissions.RuleSet{}
deny = permissions.RuleSet{}
permRuleGenerator = func(script string, access permissions.Access, roles ...string) (permissions.RuleSet, error) {
out := make([]*permissions.Rule, len(roles))
for i, role := range roles {
if r, err := svc.roles.FindByAny(role); err != nil {
return nil, errors.Wrapf(err, "could not load security role: %s", role)
} else {
out[i] = &permissions.Rule{
RoleID: r.ID,
Resource: permissions.Resource(script),
Operation: permOpExec,
Access: access,
}
}
}
return out, nil
}
)
sec = &ScriptSecurity{Security: script.Security}
if sec.RunAs != "" {
// Prefetch run-as user
if _, err = svc.users.FindByAny(sec.RunAs); err != nil {
err = errors.Wrap(err, "could not load security (run-as) user")
return
//} else {
// s.Security.runAs = u.ID
}
}
if allow, err = permRuleGenerator(script.Name, permissions.Allow, script.Security.Allow...); err != nil {
return
}
if deny, err = permRuleGenerator(script.Name, permissions.Deny, script.Security.Deny...); err != nil {
return
}
rr = append(allow, deny...)
return
}
func (svc *service) GetBundle(ctx context.Context, name, bType string) *Bundle {
if !svc.opt.Enabled {
return nil
+1
View File
@@ -25,6 +25,7 @@ type (
Description string `json:"description"`
Errors []string `json:"errors,omitempty"`
Triggers []*Trigger `json:"triggers"`
Iterator *Iterator `json:"iterator"`
Security *ScriptSecurity `json:"security"`
// If bundle or type is set, consider