use random short name for stream CRDs (#2137)
* use random short name for stream CRDs
This commit is contained in:
		
							parent
							
								
									3e148ea57e
								
							
						
					
					
						commit
						e80cccb93b
					
				| 
						 | 
					@ -32,7 +32,7 @@ clean:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
copy: clean
 | 
					copy: clean
 | 
				
			||||||
	mkdir manifests
 | 
						mkdir manifests
 | 
				
			||||||
	cp ../manifests -r .
 | 
						cp -r ../manifests .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
docker: scm-source.json
 | 
					docker: scm-source.json
 | 
				
			||||||
	docker build -t "$(IMAGE):$(TAG)" .
 | 
						docker build -t "$(IMAGE):$(TAG)" .
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,7 +91,6 @@ type Cluster struct {
 | 
				
			||||||
	currentProcess      Process
 | 
						currentProcess      Process
 | 
				
			||||||
	processMu           sync.RWMutex // protects the current operation for reporting, no need to hold the master mutex
 | 
						processMu           sync.RWMutex // protects the current operation for reporting, no need to hold the master mutex
 | 
				
			||||||
	specMu              sync.RWMutex // protects the spec for reporting, no need to hold the master mutex
 | 
						specMu              sync.RWMutex // protects the spec for reporting, no need to hold the master mutex
 | 
				
			||||||
	streamApplications  []string
 | 
					 | 
				
			||||||
	ConnectionPooler    map[PostgresRole]*ConnectionPoolerObjects
 | 
						ConnectionPooler    map[PostgresRole]*ConnectionPoolerObjects
 | 
				
			||||||
	EBSVolumes          map[string]volumes.VolumeProperties
 | 
						EBSVolumes          map[string]volumes.VolumeProperties
 | 
				
			||||||
	VolumeResizer       volumes.VolumeResizer
 | 
						VolumeResizer       volumes.VolumeResizer
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,15 +15,16 @@ import (
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Cluster) createStreams(appId string) error {
 | 
					func (c *Cluster) createStreams(appId string) (*zalandov1.FabricEventStream, error) {
 | 
				
			||||||
	c.setProcessName("creating streams")
 | 
						c.setProcessName("creating streams")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fes := c.generateFabricEventStream(appId)
 | 
						fes := c.generateFabricEventStream(appId)
 | 
				
			||||||
	if _, err := c.KubeClient.FabricEventStreams(c.Namespace).Create(context.TODO(), fes, metav1.CreateOptions{}); err != nil {
 | 
						streamCRD, err := c.KubeClient.FabricEventStreams(c.Namespace).Create(context.TODO(), fes, metav1.CreateOptions{})
 | 
				
			||||||
		return err
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return streamCRD, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Cluster) updateStreams(newEventStreams *zalandov1.FabricEventStream) error {
 | 
					func (c *Cluster) updateStreams(newEventStreams *zalandov1.FabricEventStream) error {
 | 
				
			||||||
| 
						 | 
					@ -46,11 +47,17 @@ func (c *Cluster) deleteStreams() error {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errors := make([]string, 0)
 | 
						errors := make([]string, 0)
 | 
				
			||||||
	for _, appId := range c.streamApplications {
 | 
						listOptions := metav1.ListOptions{
 | 
				
			||||||
		fesName := fmt.Sprintf("%s-%s", c.Name, appId)
 | 
							LabelSelector: c.labelsSet(true).String(),
 | 
				
			||||||
		err = c.KubeClient.FabricEventStreams(c.Namespace).Delete(context.TODO(), fesName, metav1.DeleteOptions{})
 | 
						}
 | 
				
			||||||
 | 
						streams, err := c.KubeClient.FabricEventStreams(c.Namespace).List(context.TODO(), listOptions)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return fmt.Errorf("could not list of FabricEventStreams: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, stream := range streams.Items {
 | 
				
			||||||
 | 
							err = c.KubeClient.FabricEventStreams(stream.Namespace).Delete(context.TODO(), stream.Name, metav1.DeleteOptions{})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			errors = append(errors, fmt.Sprintf("could not delete event stream %q: %v", fesName, err))
 | 
								errors = append(errors, fmt.Sprintf("could not delete event stream %q: %v", stream.Name, err))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -184,8 +191,10 @@ func (c *Cluster) generateFabricEventStream(appId string) *zalandov1.FabricEvent
 | 
				
			||||||
			Kind:       constants.EventStreamCRDKind,
 | 
								Kind:       constants.EventStreamCRDKind,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name:        fmt.Sprintf("%s-%s", c.Name, appId),
 | 
								// max length for cluster name is 58 so we can only add 5 more characters / numbers
 | 
				
			||||||
 | 
								Name:        fmt.Sprintf("%s-%s", c.Name, util.RandomPassword(5)),
 | 
				
			||||||
			Namespace:   c.Namespace,
 | 
								Namespace:   c.Namespace,
 | 
				
			||||||
 | 
								Labels:      c.labelsSet(true),
 | 
				
			||||||
			Annotations: c.AnnotationsToPropagate(c.annotationsSet(nil)),
 | 
								Annotations: c.AnnotationsToPropagate(c.annotationsSet(nil)),
 | 
				
			||||||
			// make cluster StatefulSet the owner (like with connection pooler objects)
 | 
								// make cluster StatefulSet the owner (like with connection pooler objects)
 | 
				
			||||||
			OwnerReferences: c.ownerReferences(),
 | 
								OwnerReferences: c.ownerReferences(),
 | 
				
			||||||
| 
						 | 
					@ -284,11 +293,6 @@ func (c *Cluster) syncStreams() error {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// fetch different application IDs from streams section
 | 
					 | 
				
			||||||
	// there will be a separate event stream resource for each ID
 | 
					 | 
				
			||||||
	appIds := gatherApplicationIds(c.Spec.Streams)
 | 
					 | 
				
			||||||
	c.streamApplications = appIds
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	slots := make(map[string]map[string]string)
 | 
						slots := make(map[string]map[string]string)
 | 
				
			||||||
	slotsToSync := make(map[string]map[string]string)
 | 
						slotsToSync := make(map[string]map[string]string)
 | 
				
			||||||
	publications := make(map[string]map[string]acidv1.StreamTable)
 | 
						publications := make(map[string]map[string]acidv1.StreamTable)
 | 
				
			||||||
| 
						 | 
					@ -355,32 +359,43 @@ func (c *Cluster) syncStreams() error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Cluster) createOrUpdateStreams() error {
 | 
					func (c *Cluster) createOrUpdateStreams() error {
 | 
				
			||||||
	for _, appId := range c.streamApplications {
 | 
					 | 
				
			||||||
		fesName := fmt.Sprintf("%s-%s", c.Name, appId)
 | 
					 | 
				
			||||||
		effectiveStreams, err := c.KubeClient.FabricEventStreams(c.Namespace).Get(context.TODO(), fesName, metav1.GetOptions{})
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			if !k8sutil.ResourceNotFound(err) {
 | 
					 | 
				
			||||||
				return fmt.Errorf("failed reading event stream %s: %v", fesName, err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			c.logger.Infof("event streams do not exist, create it")
 | 
						// fetch different application IDs from streams section
 | 
				
			||||||
			err = c.createStreams(appId)
 | 
						// there will be a separate event stream resource for each ID
 | 
				
			||||||
			if err != nil {
 | 
						appIds := gatherApplicationIds(c.Spec.Streams)
 | 
				
			||||||
				return fmt.Errorf("failed creating event stream %s: %v", fesName, err)
 | 
					
 | 
				
			||||||
			}
 | 
						// list all existing stream CRDs
 | 
				
			||||||
			c.logger.Infof("event stream %q has been successfully created", fesName)
 | 
						listOptions := metav1.ListOptions{
 | 
				
			||||||
		} else {
 | 
							LabelSelector: c.labelsSet(true).String(),
 | 
				
			||||||
			desiredStreams := c.generateFabricEventStream(appId)
 | 
						}
 | 
				
			||||||
			if match, reason := sameStreams(effectiveStreams.Spec.EventStreams, desiredStreams.Spec.EventStreams); !match {
 | 
						streams, err := c.KubeClient.FabricEventStreams(c.Namespace).List(context.TODO(), listOptions)
 | 
				
			||||||
				c.logger.Debugf("updating event streams: %s", reason)
 | 
						if err != nil {
 | 
				
			||||||
				desiredStreams.ObjectMeta.ResourceVersion = effectiveStreams.ObjectMeta.ResourceVersion
 | 
							return fmt.Errorf("could not list of FabricEventStreams: %v", err)
 | 
				
			||||||
				err = c.updateStreams(desiredStreams)
 | 
						}
 | 
				
			||||||
				if err != nil {
 | 
					
 | 
				
			||||||
					return fmt.Errorf("failed updating event stream %s: %v", fesName, err)
 | 
						for _, appId := range appIds {
 | 
				
			||||||
 | 
							// update stream when it exists and EventStreams array differs
 | 
				
			||||||
 | 
							for _, stream := range streams.Items {
 | 
				
			||||||
 | 
								if appId == stream.Spec.ApplicationId {
 | 
				
			||||||
 | 
									desiredStreams := c.generateFabricEventStream(appId)
 | 
				
			||||||
 | 
									if match, reason := sameStreams(stream.Spec.EventStreams, desiredStreams.Spec.EventStreams); !match {
 | 
				
			||||||
 | 
										c.logger.Debugf("updating event streams: %s", reason)
 | 
				
			||||||
 | 
										desiredStreams.ObjectMeta.ResourceVersion = stream.ObjectMeta.ResourceVersion
 | 
				
			||||||
 | 
										err = c.updateStreams(desiredStreams)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return fmt.Errorf("failed updating event stream %s: %v", stream.Name, err)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										c.logger.Infof("event stream %q has been successfully updated", stream.Name)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				c.logger.Infof("event stream %q has been successfully updated", fesName)
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							c.logger.Infof("event streams with applicationId %s do not exist, create it", appId)
 | 
				
			||||||
 | 
							streamCRD, err := c.createStreams(appId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return fmt.Errorf("failed creating event streams with applicationId %s: %v", appId, err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							c.logger.Infof("event streams %q have been successfully created", streamCRD.Name)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,6 @@ var (
 | 
				
			||||||
	appId       string = "test-app"
 | 
						appId       string = "test-app"
 | 
				
			||||||
	dbName      string = "foo"
 | 
						dbName      string = "foo"
 | 
				
			||||||
	fesUser     string = fmt.Sprintf("%s%s", constants.EventStreamSourceSlotPrefix, constants.UserRoleNameSuffix)
 | 
						fesUser     string = fmt.Sprintf("%s%s", constants.EventStreamSourceSlotPrefix, constants.UserRoleNameSuffix)
 | 
				
			||||||
	fesName     string = fmt.Sprintf("%s-%s", clusterName, appId)
 | 
					 | 
				
			||||||
	slotName    string = fmt.Sprintf("%s_%s_%s", constants.EventStreamSourceSlotPrefix, dbName, strings.Replace(appId, "-", "_", -1))
 | 
						slotName    string = fmt.Sprintf("%s_%s_%s", constants.EventStreamSourceSlotPrefix, dbName, strings.Replace(appId, "-", "_", -1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pg = acidv1.Postgresql{
 | 
						pg = acidv1.Postgresql{
 | 
				
			||||||
| 
						 | 
					@ -77,6 +76,7 @@ var (
 | 
				
			||||||
					BatchSize: k8sutil.UInt32ToPointer(uint32(100)),
 | 
										BatchSize: k8sutil.UInt32ToPointer(uint32(100)),
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
 | 
								TeamID: "acid",
 | 
				
			||||||
			Volume: acidv1.Volume{
 | 
								Volume: acidv1.Volume{
 | 
				
			||||||
				Size: "1Gi",
 | 
									Size: "1Gi",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
| 
						 | 
					@ -89,7 +89,7 @@ var (
 | 
				
			||||||
			Kind:       constants.EventStreamCRDKind,
 | 
								Kind:       constants.EventStreamCRDKind,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name:      fesName,
 | 
								Name:      fmt.Sprintf("%s-12345", clusterName),
 | 
				
			||||||
			Namespace: namespace,
 | 
								Namespace: namespace,
 | 
				
			||||||
			OwnerReferences: []metav1.OwnerReference{
 | 
								OwnerReferences: []metav1.OwnerReference{
 | 
				
			||||||
				metav1.OwnerReference{
 | 
									metav1.OwnerReference{
 | 
				
			||||||
| 
						 | 
					@ -196,9 +196,6 @@ func TestGenerateFabricEventStream(t *testing.T) {
 | 
				
			||||||
	_, err := cluster.createStatefulSet()
 | 
						_, err := cluster.createStatefulSet()
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// createOrUpdateStreams will loop over existing apps
 | 
					 | 
				
			||||||
	cluster.streamApplications = []string{appId}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// create the streams
 | 
						// create the streams
 | 
				
			||||||
	err = cluster.createOrUpdateStreams()
 | 
						err = cluster.createOrUpdateStreams()
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
| 
						 | 
					@ -209,11 +206,14 @@ func TestGenerateFabricEventStream(t *testing.T) {
 | 
				
			||||||
		t.Errorf("malformed FabricEventStream, expected %#v, got %#v", fes, result)
 | 
							t.Errorf("malformed FabricEventStream, expected %#v, got %#v", fes, result)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// compare stream resturned from API with expected stream
 | 
						// compare stream returned from API with expected stream
 | 
				
			||||||
	streamCRD, err := cluster.KubeClient.FabricEventStreams(namespace).Get(context.TODO(), fesName, metav1.GetOptions{})
 | 
						listOptions := metav1.ListOptions{
 | 
				
			||||||
 | 
							LabelSelector: cluster.labelsSet(true).String(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						streams, err := cluster.KubeClient.FabricEventStreams(namespace).List(context.TODO(), listOptions)
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	if match, _ := sameStreams(streamCRD.Spec.EventStreams, fes.Spec.EventStreams); !match {
 | 
						if match, _ := sameStreams(streams.Items[0].Spec.EventStreams, fes.Spec.EventStreams); !match {
 | 
				
			||||||
		t.Errorf("malformed FabricEventStream returned from API, expected %#v, got %#v", fes, streamCRD)
 | 
							t.Errorf("malformed FabricEventStream returned from API, expected %#v, got %#v", fes, streams.Items[0])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// sync streams once again
 | 
						// sync streams once again
 | 
				
			||||||
| 
						 | 
					@ -221,10 +221,10 @@ func TestGenerateFabricEventStream(t *testing.T) {
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// compare stream resturned from API with generated stream
 | 
						// compare stream resturned from API with generated stream
 | 
				
			||||||
	streamCRD, err = cluster.KubeClient.FabricEventStreams(namespace).Get(context.TODO(), fesName, metav1.GetOptions{})
 | 
						streams, err = cluster.KubeClient.FabricEventStreams(namespace).List(context.TODO(), listOptions)
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	if match, _ := sameStreams(streamCRD.Spec.EventStreams, result.Spec.EventStreams); !match {
 | 
						if match, _ := sameStreams(streams.Items[0].Spec.EventStreams, result.Spec.EventStreams); !match {
 | 
				
			||||||
		t.Errorf("returned FabricEventStream differs from generated one, expected %#v, got %#v", result, streamCRD)
 | 
							t.Errorf("returned FabricEventStream differs from generated one, expected %#v, got %#v", result, streams.Items[0])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -331,8 +331,9 @@ func TestUpdateFabricEventStream(t *testing.T) {
 | 
				
			||||||
		context.TODO(), &pg, metav1.CreateOptions{})
 | 
							context.TODO(), &pg, metav1.CreateOptions{})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// createOrUpdateStreams will loop over existing apps
 | 
						// create statefulset to have ownerReference for streams
 | 
				
			||||||
	cluster.streamApplications = []string{appId}
 | 
						_, err = cluster.createStatefulSet()
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = cluster.createOrUpdateStreams()
 | 
						err = cluster.createOrUpdateStreams()
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
| 
						 | 
					@ -365,11 +366,15 @@ func TestUpdateFabricEventStream(t *testing.T) {
 | 
				
			||||||
	err = cluster.createOrUpdateStreams()
 | 
						err = cluster.createOrUpdateStreams()
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	streamCRD, err := cluster.KubeClient.FabricEventStreams(namespace).Get(context.TODO(), fesName, metav1.GetOptions{})
 | 
						// compare stream returned from API with expected stream
 | 
				
			||||||
 | 
						listOptions := metav1.ListOptions{
 | 
				
			||||||
 | 
							LabelSelector: cluster.labelsSet(true).String(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						streams, err := cluster.KubeClient.FabricEventStreams(namespace).List(context.TODO(), listOptions)
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	result := cluster.generateFabricEventStream(appId)
 | 
						result := cluster.generateFabricEventStream(appId)
 | 
				
			||||||
	if !reflect.DeepEqual(result, streamCRD) {
 | 
						if !reflect.DeepEqual(result.Spec.EventStreams, streams.Items[0].Spec.EventStreams) {
 | 
				
			||||||
		t.Errorf("Malformed FabricEventStream, expected %#v, got %#v", streamCRD, result)
 | 
							t.Errorf("Malformed FabricEventStream, expected %#v, got %#v", streams.Items[0], result)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue