func TestLabelsOnCreate(t *testing.T) { store := consulStoreWithFakeKV() podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{podID.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{az.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{clusterName.String()}) annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) pc, err := store.Create(podID, az, clusterName, selector, annotations, kptest.NewSession()) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } matches, err := store.applicator.GetMatches(selector, labels.PC) if err != nil { t.Fatalf("Unable to check for label match on new pod cluster: %s", err) } if len(matches) != 1 { t.Errorf("Expected one pod cluster to match label selector") } if fields.ID(matches[0].ID) != pc.ID { t.Errorf("The pod cluster selector didn't match the new pod cluster") } }
func TestCreate(t *testing.T) { testAZ := fields.AvailabilityZone("west-coast") testCN := fields.ClusterName("test") testPodID := types.PodID("pod") selector := labels.Everything(). Add(fields.PodIDLabel, labels.EqualsOperator, []string{testPodID.String()}). Add(fields.AvailabilityZoneLabel, labels.EqualsOperator, []string{testAZ.String()}). Add(fields.ClusterNameLabel, labels.EqualsOperator, []string{testCN.String()}) session := kptest.NewSession() pcstore := pcstoretest.NewFake() pcController := NewPodCluster(testAZ, testCN, testPodID, pcstore, selector, session) annotations := map[string]string{ "load_balancer_info": "totally", "pager_information": "555-111-2222", } buf, err := json.Marshal(annotations) if err != nil { t.Errorf("json marshal error: %v", err) } var testAnnotations fields.Annotations if err := json.Unmarshal(buf, &testAnnotations); err != nil { t.Errorf("json unmarshal error: %v", err) } pc, err := pcController.Create(fields.Annotations(testAnnotations)) if err != nil { t.Errorf("got error during creation: %v", err) } if pc.ID == "" { t.Error("got empty pc ID") } if pc.PodID != testPodID { t.Errorf("Expected to get %s, got: %v", pc.PodID, testPodID) } if pc.Name != testCN { t.Errorf("Expected to get %s, got: %v", testCN, pc.Name) } if pc.AvailabilityZone != testAZ { t.Errorf("Expected to get %s, got: %v", testAZ, pc.AvailabilityZone) } if pc.PodSelector.String() != selector.String() { t.Errorf("Expected to get %s, got: %v", selector, pc.PodSelector) } if pc.Annotations["load_balancer_info"] != testAnnotations["load_balancer_info"] { t.Errorf("Expected to get %s, got: %v", testAnnotations, pc.Annotations) } if pc.Annotations["pager_information"] != testAnnotations["pager_information"] { t.Errorf("Expected to get %s, got: %v", testAnnotations, pc.Annotations) } }
func TestWatch(t *testing.T) { store := consulStoreWithFakeKV() podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{podID.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{az.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{clusterName.String()}) annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) var watched WatchedPodClusters session := kptest.NewSession() pc, err := store.Create(podID, az, clusterName, selector, annotations, session) if err != nil { t.Fatalf("Unable to create first pod cluster: %s", err) } pc2, err := store.Create(podID, "us-east", clusterName, selector, annotations, session) if err != nil { t.Fatalf("Unable to create second pod cluster: %s", err) } quit := make(chan struct{}) defer close(quit) watch := store.Watch(quit) select { case watchedPC := <-watch: watched = watchedPC case <-time.After(5 * time.Second): t.Fatal("nothing on the channel") } if len(watched.Clusters) != 2 { t.Fatalf("Expected to get two watched PodClusters, but did not: got %v", len(watched.Clusters)) } expectedIDs := []fields.ID{pc.ID, pc2.ID} for _, id := range expectedIDs { found := false for _, pc := range watched.Clusters { if id == pc.ID { found = true break } } if !found { t.Errorf("Expected to find id '%s' among watch results, but was not present", id) } } }
func createPodCluster(store *consulStore, t *testing.T) fields.PodCluster { podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{podID.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{az.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{clusterName.String()}) annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) session := kptest.NewSession() pc, err := store.Create(podID, az, clusterName, selector, annotations, session) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } if pc.ID == "" { t.Errorf("pod cluster should have an id") } if pc.PodID == "" { t.Errorf("pod cluster should have a pod id") } if pc.PodID != podID { t.Errorf("pod id wasn't properly set. Wanted '%s' got '%s'", podID, pc.PodID) } if pc.AvailabilityZone != az { t.Errorf("availability zone wasn't properly set. Wanted '%s' got '%s'", az, pc.AvailabilityZone) } if pc.Name != clusterName { t.Errorf("cluster name wasn't properly set. Wanted '%s' got '%s'", clusterName, pc.Name) } testLabels := klabels.Set{ fields.PodIDLabel: podID.String(), fields.AvailabilityZoneLabel: az.String(), fields.ClusterNameLabel: clusterName.String(), } if matches := pc.PodSelector.Matches(testLabels); !matches { t.Errorf("the pod cluster has a bad pod selector") } if pc.Annotations["foo"] != "bar" { t.Errorf("Annotations didn't match expected") } return pc }
func TestDelete(t *testing.T) { store := consulStoreWithFakeKV() podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{podID.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{az.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{clusterName.String()}) annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) // Create a pod cluster pc, err := store.Create(podID, az, clusterName, selector, annotations, kptest.NewSession()) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } pc, err = store.Get(pc.ID) if err != nil { t.Fatalf("Unable to get pod cluster: %s", err) } err = store.Delete(pc.ID) if err != nil { t.Fatalf("Unexpected error deleting pod cluster: %s", err) } _, err = store.Get(pc.ID) if err == nil { t.Fatalf("Should have gotten an error fetching a deleted pod cluster") } if !IsNotExist(err) { t.Errorf("The error should have been a pocstore.IsNotExist but was '%s'", err) } labels, err := store.applicator.GetLabels(labels.PC, pc.ID.String()) if err != nil { t.Fatalf("Got error when trying to confirm label deletion: %s", err) } if len(labels.Labels) != 0 { t.Errorf("Labels were not deleted along with the pod cluster") } }
func TestList(t *testing.T) { store := consulStoreWithFakeKV() podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything() annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) // Create a pod cluster pc, err := store.Create(podID, az, clusterName, selector, annotations, kptest.NewSession()) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } // Create another one pc2, err := store.Create(podID+"2", az, clusterName, selector, annotations, kptest.NewSession()) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } // Now test List() and make sure we get both back pcs, err := store.List() if err != nil { t.Fatalf("Unable to list pod clusters: %s", err) } if len(pcs) != 2 { t.Fatalf("Expected 2 results but there were %d", len(pcs)) } for _, foundPC := range pcs { found := false for _, expectedPC := range []fields.ID{pc.ID, pc2.ID} { if foundPC.ID == expectedPC { found = true } } if !found { t.Errorf("Didn't find one of the pod clusters in the list") } } }
func TestWatchPodCluster(t *testing.T) { store := consulStoreWithFakeKV() pod := fields.ID("pod_id") podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{pod.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{az.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{clusterName.String()}) annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) session := kptest.NewSession() pc, err := store.Create(podID, az, clusterName, selector, annotations, session) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } quit := make(chan struct{}) watch := store.WatchPodCluster(pc.ID, quit) var watched *WatchedPodCluster select { case watchedPC := <-watch: watched = &watchedPC case <-time.After(5 * time.Second): quit <- struct{}{} t.Fatal("nothing on the channel") } if watched == nil { t.Fatalf("Expected to get a watched PodCluster, but did not") } if watched.PodCluster.ID != pc.ID { t.Fatalf("Expected watched PodCluster to match %s Pod Cluster ID. Instead was %s", pc.ID, watched.PodCluster.ID) } }
func TestMutate(t *testing.T) { store := consulStoreWithFakeKV() oldPc := createPodCluster(store, t) // After creating the pod cluster, we now update it using a mutator function newPodID := types.PodID("pod_id-diff") newAz := fields.AvailabilityZone("us-west-diff") newClusterName := fields.ClusterName("cluster_name_diff") newSelector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{newPodID.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{newAz.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{newClusterName.String()}) newAnnotations := fields.Annotations(map[string]interface{}{ "bar": "foo", }) intendedPC := fields.PodCluster{ ID: oldPc.ID, PodID: newPodID, AvailabilityZone: newAz, Name: newClusterName, PodSelector: newSelector, Annotations: newAnnotations, } mutator := func(pc fields.PodCluster) (fields.PodCluster, error) { pc.PodID = intendedPC.PodID pc.AvailabilityZone = intendedPC.AvailabilityZone pc.Name = intendedPC.Name pc.PodSelector = intendedPC.PodSelector pc.Annotations = intendedPC.Annotations return pc, nil } _, err := store.MutatePC(intendedPC.ID, mutator) if err != nil { t.Fatalf("Unable to update pod cluster: %s", err) } newPC, err := store.Get(intendedPC.ID) if err != nil { t.Fatalf("Unable to find pod cluster: %s", err) } if newPC.ID == "" { t.Errorf("pod cluster should have an id") } if newPC.PodID == "" { t.Errorf("pod cluster should have a pod id") } if newPC.ID != oldPc.ID { t.Errorf("id should not have been updated. Wanted '%s' got '%s'", oldPc.ID, newPC.ID) } if newPC.PodID != newPodID { t.Errorf("pod id wasn't properly updated. Wanted '%s' got '%s'", newPodID, newPC.PodID) } if newPC.AvailabilityZone != newAz { t.Errorf("availability zone wasn't properly updated. Wanted '%s' got '%s'", newAz, newPC.AvailabilityZone) } if newPC.Name != newClusterName { t.Errorf("cluster name wasn't properly updated. Wanted '%s' got '%s'", newClusterName, newPC.Name) } newTestLabels := klabels.Set{ fields.PodIDLabel: newPodID.String(), fields.AvailabilityZoneLabel: newAz.String(), fields.ClusterNameLabel: newClusterName.String(), } if matches := newPC.PodSelector.Matches(newTestLabels); !matches { t.Errorf("the pod cluster has a bad pod selector") } if newPC.Annotations["bar"] != "foo" { t.Errorf("Annotations didn't match expected") } else if _, ok := newPC.Annotations["foo"]; ok { t.Errorf("Annotations didn't match expected") } }
func TestGet(t *testing.T) { store := consulStoreWithFakeKV() podID := types.PodID("pod_id") az := fields.AvailabilityZone("us-west") clusterName := fields.ClusterName("cluster_name") selector := klabels.Everything(). Add(fields.PodIDLabel, klabels.EqualsOperator, []string{podID.String()}). Add(fields.AvailabilityZoneLabel, klabels.EqualsOperator, []string{az.String()}). Add(fields.ClusterNameLabel, klabels.EqualsOperator, []string{clusterName.String()}) annotations := fields.Annotations(map[string]interface{}{ "foo": "bar", }) // Create a pod cluster pc, err := store.Create(podID, az, clusterName, selector, annotations, kptest.NewSession()) if err != nil { t.Fatalf("Unable to create pod cluster: %s", err) } pc, err = store.Get(pc.ID) if err != nil { t.Fatalf("Unable to get pod cluster: %s", err) } if pc.ID == "" { t.Errorf("pod cluster should have an id") } if pc.PodID == "" { t.Errorf("pod cluster should have a pod id") } if pc.PodID != podID { t.Errorf("pod id wasn't properly set. Wanted '%s' got '%s'", podID, pc.PodID) } if pc.AvailabilityZone != az { t.Errorf("availability zone wasn't properly set. Wanted '%s' got '%s'", az, pc.AvailabilityZone) } if pc.Name != clusterName { t.Errorf("cluster name wasn't properly set. Wanted '%s' got '%s'", clusterName, pc.Name) } testLabels := klabels.Set{ fields.PodIDLabel: podID.String(), fields.AvailabilityZoneLabel: az.String(), fields.ClusterNameLabel: clusterName.String(), } if matches := pc.PodSelector.Matches(testLabels); !matches { t.Errorf("the pod cluster has a bad pod selector") } if pc.Annotations["foo"] != "bar" { t.Errorf("Annotations didn't match expected") } found, err := store.FindWhereLabeled(podID, az, clusterName) if err != nil { t.Errorf("Could not retrieve labeled pods: %v", err) } if len(found) != 1 { t.Errorf("Found incorrect number of labeled pods, expected 1: %v", len(found)) } if found[0].ID != pc.ID { t.Errorf("Didn't find the right pod cluster: %v vs %v", found[0].ID, pc.ID) } }
func TestUpdate(t *testing.T) { testAZ := fields.AvailabilityZone("west-coast") testCN := fields.ClusterName("test") testPodID := types.PodID("pod") selector := labels.Everything(). Add(fields.PodIDLabel, labels.EqualsOperator, []string{testPodID.String()}). Add(fields.AvailabilityZoneLabel, labels.EqualsOperator, []string{testAZ.String()}). Add(fields.ClusterNameLabel, labels.EqualsOperator, []string{testCN.String()}) session := kptest.NewSession() pcstore := pcstoretest.NewFake() pcController := NewPodCluster(testAZ, testCN, testPodID, pcstore, selector, session) var annotations = map[string]string{ "load_balancer_info": "totally", "pager_information": "555-111-2222", } buf, err := json.Marshal(annotations) if err != nil { t.Errorf("json marshal error: %v", err) } var testAnnotations fields.Annotations if err := json.Unmarshal(buf, &testAnnotations); err != nil { t.Errorf("json unmarshal error: %v", err) } pc, err := pcController.Create(fields.Annotations(testAnnotations)) if err != nil { t.Fatalf("Unable to create pod cluster due to: %v", err) } newAnnotations := map[string]string{ "pager_information": "555-111-2222", "priority": "1001", } buf, err = json.Marshal(newAnnotations) if err != nil { t.Errorf("json marshal error: %v", err) } var newTestAnnotations fields.Annotations if err := json.Unmarshal(buf, &newTestAnnotations); err != nil { t.Errorf("json unmarshal error: %v", err) } pc, err = pcController.Update(newTestAnnotations) if err != nil { t.Fatalf("Got error updating PC annotations: %v", err) } if pc.Annotations["pager_information"] != newAnnotations["pager_information"] { t.Errorf("Got unexpected pager_information. Expected %s, got %s", newAnnotations["pager_information"], pc.Annotations["pager_information"]) } if pc.Annotations["priority"] != newAnnotations["priority"] { t.Errorf("Got unexpected priority. Expected %s, got %s", newAnnotations["priority"], pc.Annotations["priority"]) } if pc.Annotations["load_balancer_info"] != nil { t.Errorf("Expected to erase old annotation field. Instead we have: %s", pc.Annotations["load_balancer_info"]) } }