fix comparing stream annotations and improve unit test (#2820)
This commit is contained in:
parent
5450113eb5
commit
8cc6796537
|
|
@ -2204,6 +2204,8 @@ class EndToEndTestCase(unittest.TestCase):
|
||||||
{
|
{
|
||||||
"applicationId": "test-app",
|
"applicationId": "test-app",
|
||||||
"batchSize": 100,
|
"batchSize": 100,
|
||||||
|
"cpu": "100m",
|
||||||
|
"memory": "200Mi",
|
||||||
"database": "foo",
|
"database": "foo",
|
||||||
"enableRecovery": True,
|
"enableRecovery": True,
|
||||||
"tables": {
|
"tables": {
|
||||||
|
|
@ -2225,7 +2227,7 @@ class EndToEndTestCase(unittest.TestCase):
|
||||||
"eventType": "test-event",
|
"eventType": "test-event",
|
||||||
"idColumn": "id",
|
"idColumn": "id",
|
||||||
"payloadColumn": "payload",
|
"payloadColumn": "payload",
|
||||||
"recoveryEventType": "test-event-dlq"
|
"ignoreRecovery": True
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -179,29 +179,19 @@ func (c *Cluster) syncPublication(dbName string, databaseSlotsList map[string]za
|
||||||
func (c *Cluster) generateFabricEventStream(appId string) *zalandov1.FabricEventStream {
|
func (c *Cluster) generateFabricEventStream(appId string) *zalandov1.FabricEventStream {
|
||||||
eventStreams := make([]zalandov1.EventStream, 0)
|
eventStreams := make([]zalandov1.EventStream, 0)
|
||||||
resourceAnnotations := map[string]string{}
|
resourceAnnotations := map[string]string{}
|
||||||
|
var err, err2 error
|
||||||
|
|
||||||
for _, stream := range c.Spec.Streams {
|
for _, stream := range c.Spec.Streams {
|
||||||
if stream.ApplicationId != appId {
|
if stream.ApplicationId != appId {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if stream.CPU != nil {
|
|
||||||
cpu, exists := resourceAnnotations[constants.EventStreamCpuAnnotationKey]
|
err = setResourceAnnotation(&resourceAnnotations, stream.CPU, constants.EventStreamCpuAnnotationKey)
|
||||||
if exists {
|
err2 = setResourceAnnotation(&resourceAnnotations, stream.Memory, constants.EventStreamMemoryAnnotationKey)
|
||||||
isSmaller, _ := util.IsSmallerQuantity(cpu, *stream.CPU)
|
if err != nil || err2 != nil {
|
||||||
if isSmaller {
|
c.logger.Warningf("could not set resource annotation for event stream: %v", err)
|
||||||
resourceAnnotations[constants.EventStreamCpuAnnotationKey] = *stream.CPU
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if stream.Memory != nil {
|
|
||||||
memory, exists := resourceAnnotations[constants.EventStreamMemoryAnnotationKey]
|
|
||||||
if exists {
|
|
||||||
isSmaller, _ := util.IsSmallerQuantity(memory, *stream.Memory)
|
|
||||||
if isSmaller {
|
|
||||||
resourceAnnotations[constants.EventStreamMemoryAnnotationKey] = *stream.Memory
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for tableName, table := range stream.Tables {
|
for tableName, table := range stream.Tables {
|
||||||
streamSource := c.getEventStreamSource(stream, tableName, table.IdColumn)
|
streamSource := c.getEventStreamSource(stream, tableName, table.IdColumn)
|
||||||
streamFlow := getEventStreamFlow(table.PayloadColumn)
|
streamFlow := getEventStreamFlow(table.PayloadColumn)
|
||||||
|
|
@ -236,6 +226,27 @@ func (c *Cluster) generateFabricEventStream(appId string) *zalandov1.FabricEvent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setResourceAnnotation(annotations *map[string]string, resource *string, key string) error {
|
||||||
|
var (
|
||||||
|
isSmaller bool
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if resource != nil {
|
||||||
|
currentValue, exists := (*annotations)[key]
|
||||||
|
if exists {
|
||||||
|
isSmaller, err = util.IsSmallerQuantity(currentValue, *resource)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not compare resource in %q annotation: %v", key, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if isSmaller || !exists {
|
||||||
|
(*annotations)[key] = *resource
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Cluster) getEventStreamSource(stream acidv1.Stream, tableName string, idColumn *string) zalandov1.EventStreamSource {
|
func (c *Cluster) getEventStreamSource(stream acidv1.Stream, tableName string, idColumn *string) zalandov1.EventStreamSource {
|
||||||
table, schema := getTableSchema(tableName)
|
table, schema := getTableSchema(tableName)
|
||||||
streamFilter := stream.Filter[tableName]
|
streamFilter := stream.Filter[tableName]
|
||||||
|
|
@ -521,10 +532,19 @@ func (c *Cluster) syncStream(appId string) error {
|
||||||
|
|
||||||
func (c *Cluster) compareStreams(curEventStreams, newEventStreams *zalandov1.FabricEventStream) (match bool, reason string) {
|
func (c *Cluster) compareStreams(curEventStreams, newEventStreams *zalandov1.FabricEventStream) (match bool, reason string) {
|
||||||
reasons := make([]string, 0)
|
reasons := make([]string, 0)
|
||||||
|
desiredAnnotations := make(map[string]string)
|
||||||
match = true
|
match = true
|
||||||
|
|
||||||
// stream operator can add extra annotations so incl. current annotations in desired annotations
|
// stream operator can add extra annotations so incl. current annotations in desired annotations
|
||||||
desiredAnnotations := c.annotationsSet(curEventStreams.Annotations)
|
for curKey, curValue := range curEventStreams.Annotations {
|
||||||
|
if _, exists := desiredAnnotations[curKey]; !exists {
|
||||||
|
desiredAnnotations[curKey] = curValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add/or override annotations if cpu and memory values were changed
|
||||||
|
for newKey, newValue := range newEventStreams.Annotations {
|
||||||
|
desiredAnnotations[newKey] = newValue
|
||||||
|
}
|
||||||
if changed, reason := c.compareAnnotations(curEventStreams.ObjectMeta.Annotations, desiredAnnotations); changed {
|
if changed, reason := c.compareAnnotations(curEventStreams.ObjectMeta.Annotations, desiredAnnotations); changed {
|
||||||
match = false
|
match = false
|
||||||
reasons = append(reasons, fmt.Sprintf("new streams annotations do not match: %s", reason))
|
reasons = append(reasons, fmt.Sprintf("new streams annotations do not match: %s", reason))
|
||||||
|
|
|
||||||
|
|
@ -640,49 +640,49 @@ func TestSameStreams(t *testing.T) {
|
||||||
streamsA: newFabricEventStream([]zalandov1.EventStream{stream1}, nil),
|
streamsA: newFabricEventStream([]zalandov1.EventStream{stream1}, nil),
|
||||||
streamsB: newFabricEventStream([]zalandov1.EventStream{stream1, stream2}, nil),
|
streamsB: newFabricEventStream([]zalandov1.EventStream{stream1, stream2}, nil),
|
||||||
match: false,
|
match: false,
|
||||||
reason: "number of defined streams is different",
|
reason: "new streams EventStreams array does not match : number of defined streams is different",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
subTest: "different number of streams",
|
subTest: "different number of streams",
|
||||||
streamsA: newFabricEventStream([]zalandov1.EventStream{stream1}, nil),
|
streamsA: newFabricEventStream([]zalandov1.EventStream{stream1}, nil),
|
||||||
streamsB: newFabricEventStream([]zalandov1.EventStream{stream1, stream2}, nil),
|
streamsB: newFabricEventStream([]zalandov1.EventStream{stream1, stream2}, nil),
|
||||||
match: false,
|
match: false,
|
||||||
reason: "number of defined streams is different",
|
reason: "new streams EventStreams array does not match : number of defined streams is different",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
subTest: "event stream specs differ",
|
subTest: "event stream specs differ",
|
||||||
streamsA: newFabricEventStream([]zalandov1.EventStream{stream1, stream2}, nil),
|
streamsA: newFabricEventStream([]zalandov1.EventStream{stream1, stream2}, nil),
|
||||||
streamsB: fes,
|
streamsB: fes,
|
||||||
match: false,
|
match: false,
|
||||||
reason: "number of defined streams is different",
|
reason: "new streams annotations do not match: Added \"fes.zalando.org/FES_CPU\" with value \"250m\". Added \"fes.zalando.org/FES_MEMORY\" with value \"500Mi\"., new streams labels do not match the current ones, new streams EventStreams array does not match : number of defined streams is different",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
subTest: "event stream recovery specs differ",
|
subTest: "event stream recovery specs differ",
|
||||||
streamsA: newFabricEventStream([]zalandov1.EventStream{stream2}, nil),
|
streamsA: newFabricEventStream([]zalandov1.EventStream{stream2}, nil),
|
||||||
streamsB: newFabricEventStream([]zalandov1.EventStream{stream3}, nil),
|
streamsB: newFabricEventStream([]zalandov1.EventStream{stream3}, nil),
|
||||||
match: false,
|
match: false,
|
||||||
reason: "event stream specs differ",
|
reason: "new streams EventStreams array does not match : event stream specs differ",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
subTest: "event stream annotations differ",
|
subTest: "event stream with new annotations",
|
||||||
streamsA: newFabricEventStream([]zalandov1.EventStream{stream2}, nil),
|
streamsA: newFabricEventStream([]zalandov1.EventStream{stream2}, nil),
|
||||||
streamsB: newFabricEventStream([]zalandov1.EventStream{stream3}, annotationsA),
|
streamsB: newFabricEventStream([]zalandov1.EventStream{stream2}, annotationsA),
|
||||||
match: false,
|
match: false,
|
||||||
reason: "event stream specs differ",
|
reason: "new streams annotations do not match: Added \"fes.zalando.org/FES_MEMORY\" with value \"500Mi\".",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
subTest: "event stream annotations differ",
|
subTest: "event stream annotations differ",
|
||||||
streamsA: newFabricEventStream([]zalandov1.EventStream{stream2}, annotationsA),
|
streamsA: newFabricEventStream([]zalandov1.EventStream{stream3}, annotationsA),
|
||||||
streamsB: newFabricEventStream([]zalandov1.EventStream{stream3}, annotationsB),
|
streamsB: newFabricEventStream([]zalandov1.EventStream{stream3}, annotationsB),
|
||||||
match: false,
|
match: false,
|
||||||
reason: "event stream specs differ",
|
reason: "new streams annotations do not match: \"fes.zalando.org/FES_MEMORY\" changed from \"500Mi\" to \"1Gi\".",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
streamsMatch, matchReason := cluster.compareStreams(tt.streamsA, tt.streamsB)
|
streamsMatch, matchReason := cluster.compareStreams(tt.streamsA, tt.streamsB)
|
||||||
if streamsMatch != tt.match {
|
if streamsMatch != tt.match || matchReason != tt.reason {
|
||||||
t.Errorf("%s %s: unexpected match result when comparing streams: got %s, epxected %s",
|
t.Errorf("%s %s: unexpected match result when comparing streams: got %s, expected %s",
|
||||||
testName, tt.subTest, matchReason, tt.reason)
|
testName, tt.subTest, matchReason, tt.reason)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue