diff --git a/app/kumactl/cmd/apply/apply.go b/app/kumactl/cmd/apply/apply.go index 4f51902bd0db..81095cfddbf5 100644 --- a/app/kumactl/cmd/apply/apply.go +++ b/app/kumactl/cmd/apply/apply.go @@ -114,9 +114,9 @@ func upsert(rs store.ResourceStore, res model.Resource) error { return err } meta := res.GetMeta() - if err := rs.Get(context.Background(), newRes, store.GetByKey(meta.GetNamespace(), meta.GetName(), meta.GetMesh())); err != nil { + if err := rs.Get(context.Background(), newRes, store.GetByKey(meta.GetName(), meta.GetMesh())); err != nil { if store.IsResourceNotFound(err) { - return rs.Create(context.Background(), res, store.CreateByKey(meta.GetNamespace(), meta.GetName(), meta.GetMesh())) + return rs.Create(context.Background(), res, store.CreateByKey(meta.GetName(), meta.GetMesh())) } else { return err } diff --git a/app/kumactl/cmd/apply/apply_test.go b/app/kumactl/cmd/apply/apply_test.go index c672217a2f4a..57734c6c6cae 100644 --- a/app/kumactl/cmd/apply/apply_test.go +++ b/app/kumactl/cmd/apply/apply_test.go @@ -47,13 +47,12 @@ var _ = Describe("kumactl apply", func() { ValidatePersistedResource := func() { resource := mesh.DataplaneResource{} - err := store.Get(context.Background(), &resource, core_store.GetByKey("default", "sample", "default")) + err := store.Get(context.Background(), &resource, core_store.GetByKey("sample", "default")) Expect(err).ToNot(HaveOccurred()) // then Expect(resource.Meta.GetName()).To(Equal("sample")) Expect(resource.Meta.GetMesh()).To(Equal("default")) - Expect(resource.Meta.GetNamespace()).To(Equal("default")) // and Expect(resource.Spec.Networking.Inbound).To(HaveLen(1)) Expect(resource.Spec.Networking.Inbound[0].Interface).To(Equal("1.1.1.1:80:8080")) @@ -143,7 +142,7 @@ var _ = Describe("kumactl apply", func() { }, }, } - err := store.Create(context.Background(), &newResource, core_store.CreateByKey("default", "sample", "default")) + err := store.Create(context.Background(), &newResource, core_store.CreateByKey("sample", "default")) Expect(err).ToNot(HaveOccurred()) // given @@ -176,13 +175,12 @@ var _ = Describe("kumactl apply", func() { // when resource := mesh.MeshResource{} // with production code, the mesh is not required for remote store. API Server then infer mesh from the name - err = store.Get(context.Background(), &resource, core_store.GetByKey("default", "sample", "")) + err = store.Get(context.Background(), &resource, core_store.GetByKey("sample", "")) Expect(err).ToNot(HaveOccurred()) // then Expect(resource.Meta.GetName()).To(Equal("sample")) Expect(resource.Meta.GetMesh()).To(Equal("")) - Expect(resource.Meta.GetNamespace()).To(Equal("default")) }) It("should apply a new Dataplane resource from URL", func() { @@ -242,13 +240,12 @@ var _ = Describe("kumactl apply", func() { // when resource := mesh.MeshResource{} // with production code, the mesh is not required for remote store. API Server then infer mesh from the name - err = store.Get(context.Background(), &resource, core_store.GetByKey("default", "meshinit", "")) + err = store.Get(context.Background(), &resource, core_store.GetByKey("meshinit", "")) Expect(err).ToNot(HaveOccurred()) // then Expect(resource.Meta.GetName()).To(Equal("meshinit")) Expect(resource.Meta.GetMesh()).To(Equal("")) - Expect(resource.Meta.GetNamespace()).To(Equal("default")) }) It("should return kuma api server error", func() { diff --git a/app/kumactl/cmd/get/get_dataplanes_test.go b/app/kumactl/cmd/get/get_dataplanes_test.go index 530fdd1c723a..513639cd6938 100644 --- a/app/kumactl/cmd/get/get_dataplanes_test.go +++ b/app/kumactl/cmd/get/get_dataplanes_test.go @@ -35,9 +35,8 @@ var _ = Describe("kumactl get dataplanes", func() { dataplanes = []*mesh_core.DataplaneResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "trial", - Name: "experiment", + Mesh: "default", + Name: "experiment", }, Spec: mesh_proto.Dataplane{ Networking: &mesh_proto.Dataplane_Networking{ @@ -62,9 +61,8 @@ var _ = Describe("kumactl get dataplanes", func() { }, { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "demo", - Name: "example", + Mesh: "default", + Name: "example", }, Spec: mesh_proto.Dataplane{ Networking: &mesh_proto.Dataplane_Networking{ @@ -105,9 +103,8 @@ var _ = Describe("kumactl get dataplanes", func() { for _, pt := range dataplanes { key := core_model.ResourceKey{ - Mesh: pt.Meta.GetMesh(), - Namespace: pt.Meta.GetNamespace(), - Name: pt.Meta.GetName(), + Mesh: pt.Meta.GetMesh(), + Name: pt.Meta.GetName(), } err := store.Create(context.Background(), pt, core_store.CreateBy(key)) Expect(err).ToNot(HaveOccurred()) diff --git a/app/kumactl/cmd/get/get_meshes_test.go b/app/kumactl/cmd/get/get_meshes_test.go index 8d3dca61d5b9..25b55f258310 100644 --- a/app/kumactl/cmd/get/get_meshes_test.go +++ b/app/kumactl/cmd/get/get_meshes_test.go @@ -40,9 +40,8 @@ var _ = Describe("kumactl get meshes", func() { }, }, Meta: &test_model.ResourceMeta{ - Mesh: "mesh1", - Name: "mesh1", - Namespace: "", + Mesh: "mesh1", + Name: "mesh1", }, }, { @@ -57,9 +56,8 @@ var _ = Describe("kumactl get meshes", func() { }, }, Meta: &test_model.ResourceMeta{ - Mesh: "mesh2", - Name: "mesh2", - Namespace: "", + Mesh: "mesh2", + Name: "mesh2", }, }, } @@ -86,9 +84,8 @@ var _ = Describe("kumactl get meshes", func() { for _, ds := range sampleMeshes { key := core_model.ResourceKey{ - Mesh: ds.Meta.GetMesh(), - Namespace: ds.Meta.GetNamespace(), - Name: ds.Meta.GetName(), + Mesh: ds.Meta.GetMesh(), + Name: ds.Meta.GetName(), } err := store.Create(context.Background(), ds, core_store.CreateBy(key)) Expect(err).ToNot(HaveOccurred()) diff --git a/app/kumactl/cmd/get/get_proxytemplates_test.go b/app/kumactl/cmd/get/get_proxytemplates_test.go index 8230ee2da0b2..8285d71ee612 100644 --- a/app/kumactl/cmd/get/get_proxytemplates_test.go +++ b/app/kumactl/cmd/get/get_proxytemplates_test.go @@ -34,25 +34,22 @@ var _ = Describe("kumactl get proxytemplates", func() { sampleProxyTemplates = []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "trial", - Name: "custom-template", + Mesh: "default", + Name: "custom-template", }, Spec: mesh_proto.ProxyTemplate{}, }, { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "demo", - Name: "another-template", + Mesh: "default", + Name: "another-template", }, Spec: mesh_proto.ProxyTemplate{}, }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "simple-template", + Mesh: "pilot", + Name: "simple-template", }, Spec: mesh_proto.ProxyTemplate{}, }, @@ -81,9 +78,8 @@ var _ = Describe("kumactl get proxytemplates", func() { for _, pt := range sampleProxyTemplates { key := core_model.ResourceKey{ - Mesh: pt.Meta.GetMesh(), - Namespace: pt.Meta.GetNamespace(), - Name: pt.Meta.GetName(), + Mesh: pt.Meta.GetMesh(), + Name: pt.Meta.GetName(), } err := store.Create(context.Background(), pt, core_store.CreateBy(key)) Expect(err).ToNot(HaveOccurred()) diff --git a/app/kumactl/cmd/get/get_traffic_logs_test.go b/app/kumactl/cmd/get/get_traffic_logs_test.go index b1f61a0c831c..b686dfb0c6b6 100644 --- a/app/kumactl/cmd/get/get_traffic_logs_test.go +++ b/app/kumactl/cmd/get/get_traffic_logs_test.go @@ -50,9 +50,8 @@ var _ = Describe("kumactl get traffic-logs", func() { }, }, Meta: &test_model.ResourceMeta{ - Mesh: "default", - Name: "web1-to-backend1", - Namespace: "", + Mesh: "default", + Name: "web1-to-backend1", }, }, { @@ -78,9 +77,8 @@ var _ = Describe("kumactl get traffic-logs", func() { }, }, Meta: &test_model.ResourceMeta{ - Mesh: "default", - Name: "web2-to-backend2", - Namespace: "", + Mesh: "default", + Name: "web2-to-backend2", }, }, } diff --git a/app/kumactl/cmd/get/get_traffic_routes_test.go b/app/kumactl/cmd/get/get_traffic_routes_test.go index e231fa730954..a534c832f884 100644 --- a/app/kumactl/cmd/get/get_traffic_routes_test.go +++ b/app/kumactl/cmd/get/get_traffic_routes_test.go @@ -34,25 +34,22 @@ var _ = Describe("kumactl get traffic-routes", func() { sampleTrafficRoutes = []*mesh_core.TrafficRouteResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "trial", - Name: "web-to-backend", + Mesh: "default", + Name: "web-to-backend", }, Spec: mesh_proto.TrafficRoute{}, }, { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "demo", - Name: "backend-to-db", + Mesh: "default", + Name: "backend-to-db", }, Spec: mesh_proto.TrafficRoute{}, }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "gateway-to-service", + Mesh: "pilot", + Name: "gateway-to-service", }, Spec: mesh_proto.TrafficRoute{}, }, @@ -81,9 +78,8 @@ var _ = Describe("kumactl get traffic-routes", func() { for _, pt := range sampleTrafficRoutes { key := core_model.ResourceKey{ - Mesh: pt.Meta.GetMesh(), - Namespace: pt.Meta.GetNamespace(), - Name: pt.Meta.GetName(), + Mesh: pt.Meta.GetMesh(), + Name: pt.Meta.GetName(), } err := store.Create(context.Background(), pt, core_store.CreateBy(key)) Expect(err).ToNot(HaveOccurred()) diff --git a/app/kumactl/cmd/get/get_trafficpermissions_test.go b/app/kumactl/cmd/get/get_trafficpermissions_test.go index 793f9c2008da..c76ee90e599f 100644 --- a/app/kumactl/cmd/get/get_trafficpermissions_test.go +++ b/app/kumactl/cmd/get/get_trafficpermissions_test.go @@ -47,9 +47,8 @@ var _ = Describe("kumactl get traffic-permissions", func() { }, }, Meta: &test_model.ResourceMeta{ - Mesh: "default", - Name: "web1-to-backend1", - Namespace: "", + Mesh: "default", + Name: "web1-to-backend1", }, }, { @@ -72,9 +71,8 @@ var _ = Describe("kumactl get traffic-permissions", func() { }, }, Meta: &test_model.ResourceMeta{ - Mesh: "default", - Name: "web2-to-backend2", - Namespace: "", + Mesh: "default", + Name: "web2-to-backend2", }, }, } diff --git a/app/kumactl/cmd/inspect/inspect_dataplanes_test.go b/app/kumactl/cmd/inspect/inspect_dataplanes_test.go index 1faace47e7ad..c5b07f9e452a 100644 --- a/app/kumactl/cmd/inspect/inspect_dataplanes_test.go +++ b/app/kumactl/cmd/inspect/inspect_dataplanes_test.go @@ -53,9 +53,8 @@ var _ = Describe("kumactl inspect dataplanes", func() { sampleDataplaneOverview = []*mesh_core.DataplaneOverviewResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "trial", - Name: "experiment", + Mesh: "default", + Name: "experiment", }, Spec: mesh_proto.DataplaneOverview{ Dataplane: &mesh_proto.Dataplane{ @@ -108,9 +107,8 @@ var _ = Describe("kumactl inspect dataplanes", func() { }, { Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "demo", - Name: "example", + Mesh: "default", + Name: "example", }, Spec: mesh_proto.DataplaneOverview{ Dataplane: &mesh_proto.Dataplane{ diff --git a/app/kumactl/cmd/install/testdata/install-control-plane.defaults.golden.yaml b/app/kumactl/cmd/install/testdata/install-control-plane.defaults.golden.yaml index addf01d227cd..6b5123a9e457 100644 --- a/app/kumactl/cmd/install/testdata/install-control-plane.defaults.golden.yaml +++ b/app/kumactl/cmd/install/testdata/install-control-plane.defaults.golden.yaml @@ -889,7 +889,7 @@ spec: names: kind: Mesh plural: meshes - scope: "" + scope: Cluster validation: openAPIV3Schema: description: Mesh is the Schema for the meshes API diff --git a/app/kumactl/cmd/install/testdata/install-control-plane.overrides.golden.yaml b/app/kumactl/cmd/install/testdata/install-control-plane.overrides.golden.yaml index 8fc8a5431cee..394893e6b1c2 100644 --- a/app/kumactl/cmd/install/testdata/install-control-plane.overrides.golden.yaml +++ b/app/kumactl/cmd/install/testdata/install-control-plane.overrides.golden.yaml @@ -889,7 +889,7 @@ spec: names: kind: Mesh plural: meshes - scope: "" + scope: Cluster validation: openAPIV3Schema: description: Mesh is the Schema for the meshes API diff --git a/app/kumactl/data/install/k8s/control-plane/crds/kuma.io_meshes.yaml b/app/kumactl/data/install/k8s/control-plane/crds/kuma.io_meshes.yaml index 94603764445f..bdd94b4a2c44 100644 --- a/app/kumactl/data/install/k8s/control-plane/crds/kuma.io_meshes.yaml +++ b/app/kumactl/data/install/k8s/control-plane/crds/kuma.io_meshes.yaml @@ -10,7 +10,7 @@ spec: names: kind: Mesh plural: meshes - scope: "" + scope: Cluster validation: openAPIV3Schema: description: Mesh is the Schema for the meshes API diff --git a/app/kumactl/pkg/install/k8s/control-plane/templates_vfsdata.go b/app/kumactl/pkg/install/k8s/control-plane/templates_vfsdata.go index a217a0979fdf..21111f804928 100644 --- a/app/kumactl/pkg/install/k8s/control-plane/templates_vfsdata.go +++ b/app/kumactl/pkg/install/k8s/control-plane/templates_vfsdata.go @@ -29,7 +29,7 @@ var Templates = func() http.FileSystem { }, "/control-plane/crds": &vfsgen۰DirInfo{ name: "crds", - modTime: time.Date(2019, 11, 13, 8, 14, 51, 55540341, time.UTC), + modTime: time.Date(2019, 11, 26, 15, 50, 15, 474572551, time.UTC), }, "/control-plane/crds/kuma.io_dataplaneinsights.yaml": &vfsgen۰CompressedFileInfo{ name: "kuma.io_dataplaneinsights.yaml", @@ -47,10 +47,10 @@ var Templates = func() http.FileSystem { }, "/control-plane/crds/kuma.io_meshes.yaml": &vfsgen۰CompressedFileInfo{ name: "kuma.io_meshes.yaml", - modTime: time.Date(2019, 9, 10, 9, 59, 52, 148262079, time.UTC), - uncompressedSize: 23742, + modTime: time.Date(2019, 11, 26, 15, 50, 15, 473593133, time.UTC), + uncompressedSize: 23747, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5c\xeb\x73\xdb\x38\x92\xff\x9e\xbf\xa2\xcb\xfb\xc1\x49\x95\x24\x27\x93\xdd\xab\x5b\x7f\xf3\x39\xc9\x9c\x6f\xf2\xaa\xd8\x99\xab\xab\xcd\xd6\x15\x44\xb6\x24\xac\x29\x80\x03\x80\xb6\x35\x7f\xfd\x55\x77\x03\x7c\x88\x0f\xc9\x89\x67\xea\xf8\xcd\x32\xd9\x04\xfa\xf9\xeb\x07\xf8\x6c\x3e\x9f\x3f\x53\xa5\xfe\x15\x9d\xd7\xd6\x9c\x83\x2a\x35\x3e\x04\x34\xf4\x97\x5f\xdc\xfe\xbb\x5f\x68\x7b\x76\xf7\x6a\x89\x41\xbd\x7a\x76\xab\x4d\x7e\x0e\x97\x95\x0f\x76\xfb\x05\xbd\xad\x5c\x86\x6f\x70\xa5\x8d\x0e\xda\x9a\x67\x5b\x0c\x2a\x57\x41\x9d\x3f\x03\xc8\x1c\x2a\xfa\xf1\x46\x6f\xd1\x07\xb5\x2d\xcf\xc1\x54\x45\xf1\x0c\xc0\xa8\x2d\x9e\xc3\x16\xfd\x06\xfd\xe2\xb6\xda\xaa\x85\xb6\xcf\x7c\x89\x19\x3d\xb6\x76\xb6\x2a\xcf\x21\xfd\x2c\x77\x7b\xfa\x0f\x80\xbc\xfd\x03\xfa\x0d\xff\x59\x16\x95\x53\x45\xa2\xf4\x0c\xc0\x67\xb6\xc4\x73\x38\x39\x79\x06\x70\xa7\x0a\x9d\xf3\x02\xe4\x59\x5b\xa2\xb9\xf8\x7c\xf5\xeb\xeb\xeb\x6c\x83\x5b\x25\x3f\x02\xe4\xe8\x33\xa7\x4b\xbe\x8f\x29\x83\xf6\x10\x36\x08\x72\x1b\xac\xac\xe3\x3f\xe5\x1d\x70\xf1\xf9\x2a\x3e\x58\x3a\x5b\xa2\x0b\x3a\xad\x8d\xae\x16\x1b\xeb\xdf\xf6\x5e\x71\x4a\x6b\x90\x7b\x20\x27\xc6\xa1\xbc\xee\x4e\x7e\xc3\x1c\xbc\xbc\xd8\xae\x20\x6c\xb4\x07\x87\xa5\x43\x8f\x26\xf0\x5e\x5a\x64\x81\x6e\x51\x06\xec\xf2\x5f\x98\x85\x05\x5c\xa3\x23\x22\xe0\x37\xb6\x2a\x72\xc8\xac\xb9\x43\x17\xc0\x61\x66\xd7\x46\xff\x5e\x53\xf6\x10\x2c\xbf\xb2\x50\x01\x7d\xe8\x50\xd4\x26\xa0\x33\xaa\x20\xee\x55\x38\x03\x65\x72\xd8\xaa\x1d\x38\xa4\x77\x40\x65\x5a\xd4\xf8\x16\xbf\x80\x0f\xd6\x21\x68\xb3\xb2\xe7\xb0\x09\xa1\xf4\xe7\x67\x67\x6b\x1d\x92\xe2\x64\x76\xbb\xad\x8c\x0e\xbb\xb3\xcc\x9a\xe0\xf4\xb2\x0a\xd6\xf9\xb3\x1c\xef\xb0\x38\x53\xa5\x9e\xf3\x3a\x4d\x60\x65\xdb\xe6\x7f\x71\x51\xa9\xfc\x69\x6b\x61\x61\x47\x62\xf5\xc1\x69\xb3\xae\x7f\x66\x65\x18\x65\xf3\x2f\xda\xe4\x24\x4a\x15\x1f\x93\xe5\x36\xdc\xa4\x9f\x88\x09\x5f\xde\x5e\xdf\x40\x7a\x29\x73\xbc\xcb\x62\x66\x6e\xf3\x98\x6f\xf8\x4c\x7c\xd1\x66\x85\x4e\xe4\xb4\x72\x76\xcb\x14\xd1\xe4\xa5\xd5\x26\xf0\x1f\x59\xa1\xd1\x74\x79\xec\xab\xe5\x56\x07\x12\xec\x6f\x15\xfa\x40\xe2\x58\xc0\xa5\x32\xc6\x06\x58\x22\x54\x65\xae\x02\xe6\x0b\xb8\x32\x70\xa9\xb6\x58\x5c\x2a\x8f\x4f\xcd\x65\x62\xa8\x9f\x13\x07\x0f\xf3\xb9\x6d\xd3\xe9\x1a\x52\x7e\x36\x00\xda\x05\x2b\xea\xde\x3f\x00\x54\x9e\xb3\x8f\x50\xc5\xe7\x91\x87\x47\x57\x30\x68\x46\xcd\x9b\x58\xcc\x06\x2a\xe3\x83\xab\xb2\x50\x39\xcc\xe1\x16\x77\x51\xe2\x5b\x55\x82\x0f\x96\x7e\xbc\xd7\x61\xd3\x7b\xa3\x6a\x4b\x5f\x05\x16\xeb\x12\xc1\x63\x80\xe5\x0e\xc8\x13\xb2\x41\x04\x6b\x0b\xb6\x1c\xa6\xc5\x86\xe1\x30\x38\x8d\x77\xd8\x27\xe9\x96\x3a\x38\xe5\x76\x35\xef\x16\x70\xb3\xc1\x1d\x28\x87\x40\x62\xfe\xad\x42\xb7\x53\xcb\x42\xe8\x44\x83\x5d\x22\xb0\x92\xb9\x3b\xcc\x7b\x24\xef\x37\x68\x60\x6b\x73\xbd\xda\x91\xe6\x8a\x5a\xf6\x8d\xef\xfc\xec\xec\xb6\x5a\xa2\x33\x18\x90\x15\x23\xb7\x99\x3f\xab\x3c\xba\xf9\xba\xd2\x39\x9e\xb5\x04\x74\xfa\x6c\x88\xf5\x42\xb9\xf3\xaf\xac\xa8\x7c\x40\xf7\x91\xbc\xf6\x94\x4c\x6e\x36\xc8\xce\x5a\x5c\x17\xa6\xe7\xe0\x7e\xa3\xb3\x0d\xff\x12\xad\x69\x89\x85\x35\x6b\x51\xfc\x9b\x7d\x8b\xa3\x4b\x7b\xa8\x3c\xe6\xc4\xee\x5c\x7b\xb2\xd5\x4a\xfb\x4d\x2d\x28\xcf\x92\x04\x4f\xef\xe2\x17\x12\x17\x39\x4c\x94\x2a\x23\x76\x40\xae\x57\x2b\x74\xfb\x96\xd7\xda\x8c\x97\x37\xc3\x4a\x63\xc1\x7e\x82\xc4\x42\x32\x57\x66\x77\xbf\x41\x87\xe0\xf4\x7a\x13\xc0\xd8\x7b\xa6\xae\x4a\xcd\x92\x71\x30\xb0\xdc\xb5\x65\x6f\x62\x41\xaf\x0d\xcb\x23\x80\x5e\x31\x35\x6d\x24\x0c\x22\x58\x17\x2d\x3b\xd9\xfd\x62\x90\xfd\x03\x9a\xdf\x8f\xa3\x53\x42\x38\xb9\xdc\xbf\x5d\xbc\x60\xa8\xff\xec\xb9\x40\xd9\x58\xdf\x14\xf5\x16\x45\xef\xd8\xbf\x45\xd9\xdd\x2b\x1f\xb7\x44\x2e\x2a\x24\xd6\xad\x2b\xe5\x94\x09\x28\x42\x13\xfb\xe9\x8b\xd5\xc0\x46\x95\x25\x1a\x3f\x5f\xe2\x8a\x38\x65\x5d\x8e\x0e\x54\xe6\xac\xf7\xe0\xb1\x54\x8e\x79\x55\xa2\x13\x1d\x5d\xc0\x25\x3b\x50\xf1\xb6\xc6\xf6\x69\x12\x97\x79\x7d\x6c\xed\x69\x49\xf5\x1e\x31\xa7\xb7\x7e\x79\x77\xf9\xfa\xf5\xeb\xbf\x53\x30\xdf\xb2\x38\xb5\xa7\x9f\xbf\xde\x5c\x2e\xe0\x9b\xe9\xd1\xfc\x6c\xcb\x8a\x82\x63\x4e\x1e\x80\x39\xb4\xf3\x01\xb7\x0b\xf8\x82\x2a\x9f\x5b\x53\xec\x16\xf0\xb1\x2a\x0a\x06\x07\x85\xf6\x03\x86\xf8\x83\xfe\x39\xf9\x8d\x93\xbd\xb5\xd1\x06\x54\x38\x07\x52\xa4\x39\x09\xe8\x58\x25\xca\xb1\x40\xa2\xfe\xb3\x53\x19\x7e\x46\xa7\x6d\x7e\x8d\x99\x35\x79\xcf\x07\x77\xb4\xe9\x63\xb5\x5d\xa2\x23\x83\xf6\x72\x37\xa8\xa2\xb0\xf7\x98\x47\x5c\xd4\xe8\x45\xb0\xb0\x26\xda\xab\xaa\x28\x76\x7d\x5d\x42\xb7\xd5\x86\x64\x1b\x05\xaf\x03\xdc\xeb\xa2\x20\x4d\x71\xb8\xb5\x77\x44\x31\x05\xd0\xc4\xed\x4f\xa6\xd8\xb1\x7c\x49\x09\x7b\x24\xd3\x8e\xba\x7a\x5e\x78\x4b\x8f\x2c\xe0\x83\xda\x01\x49\x8a\x75\x71\x63\x5d\x40\x43\x1a\xdb\x48\x70\x84\xb3\xda\x84\x7f\xfb\xeb\x20\x57\x09\x1b\xad\xf7\xec\xa4\xb7\x88\x69\xdb\x7c\x33\xb4\xe6\x2f\xef\x2e\x81\xb5\x93\xbd\x03\x69\x27\x5b\x9e\x0a\xb5\xe3\x1c\x70\x39\x75\xcc\x4a\x5c\xe4\x95\xd0\x0e\xbb\x6e\x2d\x86\xb1\xc6\xcc\xc5\xa2\x55\x2d\xac\x51\xbe\x8a\x19\xb1\xab\x6a\x0c\x81\x22\xc9\x2c\x59\x10\xd9\x7d\xae\x1d\x66\x41\xe4\x14\x38\xa2\x2d\xfb\xd2\x57\x11\x06\x71\x14\x6c\x96\xae\x3d\xe0\x43\x89\x59\xa8\x9d\x46\xdc\x04\x3c\x37\x16\x28\x44\xa0\x83\x3b\xed\xf5\xb2\xe8\xc7\x58\xd6\x96\x9a\x14\x1b\xa1\x2c\x8c\x56\xe5\x50\x65\x9b\xb8\x1a\x0e\x0c\x2f\x40\xad\x02\x0a\x92\x67\xee\xea\xbe\x42\x85\x9a\x71\x33\xb0\x86\xe1\x00\xc2\x4a\x1b\x55\xe8\xdf\x09\xef\xd1\x3b\x78\xcd\xdb\x32\xec\x16\x70\xe1\x79\x89\xa0\xfc\xde\x8d\x3d\xc2\xfc\x20\xd9\xbd\xd2\x04\x56\x02\x6e\xfd\xac\xc3\xe6\x65\x61\xb3\x5b\x92\xdd\xa7\xf4\xda\x9e\x5e\x0d\x85\x48\x8f\x61\xd6\xf2\x7d\xc9\x45\x32\x88\x34\x24\x78\xeb\x12\x92\x59\x55\x2e\x6c\x28\x78\x99\x88\xfd\x57\x15\xe1\xa4\x59\x5f\x54\x45\xd8\xd8\x6a\xbd\x21\x03\x4d\x48\x28\x59\x0f\xc4\x54\xa8\xe6\x7a\xbc\x21\x49\xad\x74\xda\x0e\x84\x11\x2b\x6b\x24\xb6\x2f\xe0\x9d\x75\x80\x0f\x6a\x5b\x16\x94\x5d\xb0\x3e\xc5\x04\x83\x35\x4d\x20\x98\x82\xd2\xb2\x86\x45\xca\x43\x81\xe4\xf5\xcb\xe4\x92\x44\xab\x7e\xa9\x96\x74\xb3\xd8\x03\xc9\x9f\xf5\xde\xa3\xc9\x29\xcc\x35\xfa\x5e\xbb\xa2\xfd\x64\x8a\x2e\xaf\xd7\x82\xf5\x04\xbf\x88\xc8\x48\xf6\xda\xf0\x2f\xa5\xcd\x17\x70\x11\x35\x49\x85\xd6\x22\x66\xfc\xff\xb8\x88\x3e\x7a\xa3\x45\xd1\x5a\x40\xc1\x46\xb9\xbc\xbd\x88\xf4\xd2\xe7\xd7\x57\x3f\xff\x72\xf5\xfe\xfd\x8b\xde\xeb\x49\xad\xfb\x82\xe2\x55\x64\x05\x2a\x53\x95\xb3\xe8\x44\xd3\x22\x1b\x5f\x7a\xf1\xf9\x8a\x33\x09\xfe\x07\x87\xc4\x8c\xf1\x99\xc1\x70\x6f\xdd\x6d\x8f\x6c\xa9\x5c\x60\x98\xee\x67\x1d\xf7\x4e\x32\xf2\x81\xb6\x81\x0f\xa4\xce\xc9\x9c\xa2\x60\x59\x47\x67\x50\x99\xa0\xfb\x1e\x45\x19\x50\xf9\x56\x1b\xed\x83\x53\xc1\x3a\xd2\x23\x55\x05\xbb\x55\xa2\x35\x36\x43\xef\x21\x53\x94\x10\x0b\x63\xb0\xab\x67\x03\xfe\x8f\xc3\x4c\x13\x56\x08\x8b\xac\x12\x86\x9b\x35\xc2\xae\xad\x2c\x42\xd2\xb8\x9b\x8d\xea\x53\x14\xcb\x41\xd3\x38\x3d\xc2\x06\x63\x58\x60\xdf\x8d\xd6\x6f\x1a\x32\xd4\x16\xc5\x16\x82\xf8\x7f\x8e\x18\x1a\x87\x36\x19\xd3\x3e\x54\x9e\x3d\x0e\x7b\xc5\x14\xdd\x5b\xac\x6e\xac\xb8\x51\x4a\x87\x6b\xd2\x85\x5e\x0c\x06\x78\xab\xb2\x0d\xa0\x09\x6e\x17\x93\x3a\x9d\xd3\x1e\x57\x1a\x5d\x5d\x89\x71\xe8\x4b\x6b\x38\x2a\x40\x66\xb7\xa5\x35\x68\xa2\xe3\x20\x3b\x1b\x08\x95\xb5\x69\x08\xe5\x7a\x1d\xe4\x98\x59\x71\x06\x5d\x6e\x57\x67\x86\xe4\x6a\xac\x99\x1b\x5d\xcc\x98\xae\xc6\xe8\x26\x74\x0c\x15\xa4\xd0\x09\x81\x44\x8c\xb3\xbf\x61\x8e\x05\x8f\x4a\x82\xe5\x5f\xca\x39\xd5\x0d\xb3\x6b\x34\x84\x99\xf1\x60\x92\x76\xf2\x73\xeb\xce\xc8\x64\x5b\x4a\x62\x4e\x1e\x62\xa5\x1f\x66\x92\x7c\x75\x60\x43\x3f\x52\x10\xe0\x8b\xa4\xc8\x91\x1b\xfd\x5b\x15\xb3\xb1\x4f\x1f\xdf\xff\x0f\x5c\xbd\xe3\xa7\xf9\x2d\x82\x46\x36\xca\x37\x46\x56\x3a\x7b\xa7\xf3\x3e\x47\x40\xc4\xd1\x86\x30\xb4\x18\x71\xaf\x4c\xdd\x61\xa8\x9c\x11\xc8\xd0\x54\x58\x1a\x1c\x34\x9a\xf9\x85\x8d\x32\x0d\x99\x52\x79\x5f\xc3\x25\x89\x9f\x4c\x82\x11\xe4\x92\x35\x6b\xa9\x4d\x2c\x1a\xd4\x1b\xec\x47\x8c\x6a\xb5\xd2\x0f\x12\x82\xd2\x9e\x22\xb9\x4d\x44\x06\x9c\xa6\x36\xd5\x48\x70\x55\x81\x3e\xc1\x06\xe2\x4f\xdf\xb9\x09\x08\x49\xc5\xb7\x25\x42\x70\x95\xc9\xda\x5e\xa8\x40\xb3\x0e\x9b\xa4\xa2\xb2\x0a\xf6\x33\xda\x31\x6b\x7a\x34\xb7\xea\x56\x6c\x40\x16\x17\xe5\x65\x4d\x4b\xc6\xec\xef\x7a\xec\xf7\x25\x66\x64\x80\x03\x21\x88\xa0\xea\x06\x6b\x35\x90\x1c\x5c\x02\x44\x0c\x88\x09\x73\x12\x67\x3f\x7e\xba\x89\xc2\x03\x05\x7f\x7d\xf9\x77\x98\x0f\xc4\x75\x1f\x50\xe5\xb3\x3a\x3d\x40\xcd\xb0\x25\x3e\xf6\xd3\xcb\x57\x70\x29\xb9\x27\xc5\x90\xbf\xbd\x7c\x29\xd2\xf9\x82\xca\x5b\x13\x0b\x73\x64\xbf\xb6\x1a\x4a\x3e\x73\x9d\xa9\x20\x68\xa0\xad\xae\x19\x57\x5f\x22\x70\x5a\xd9\xca\xe4\x29\xdc\x0b\x0e\x2f\x0a\x1b\x02\xe6\x03\x58\x29\xee\x3f\x6a\x60\x2c\xe3\x38\x24\x1f\xf3\x3c\xd9\x54\xb1\xeb\x43\x4f\x5e\x08\x67\xa6\x03\x4a\x8a\xf0\x85\x28\xcc\x05\x66\x6c\x50\xe5\xe8\x5e\xb0\x68\x2e\xca\xb2\xd0\xb4\x75\x72\x2a\x7a\x05\xc9\x82\x39\xec\x25\x29\xf5\x0d\xea\x69\xe3\x8c\xce\x71\x5b\xda\x80\x26\xdb\xed\x87\x9a\x51\xb7\x15\x15\x64\xaf\x2c\x0e\xfb\xae\xe9\x02\x3c\x05\x4a\x42\x28\x46\xf2\xce\x4e\xa9\x42\xa5\x4d\x66\x2d\x82\x60\x57\x83\x3c\xcc\xd1\xb3\x25\xf8\xa0\x02\x2e\x8e\xc9\xe8\x9f\x24\x1f\xe4\x3e\xc8\x31\x61\xf3\xe4\xc2\xb4\x6f\x96\x1a\x0d\x4b\xc0\x16\x45\x5d\x33\x43\xb3\xb2\x5c\xef\xf2\x76\x9b\xd6\x3c\xa0\xd8\x77\xca\x69\x65\x02\xa5\x8c\x31\xea\xa6\x9a\x51\x44\xdd\xdd\x9c\x50\x49\x7c\xb2\xab\xce\x72\x87\xfc\x25\x21\xa5\x3b\x29\x59\xee\x30\x80\xe2\x54\xcd\x76\x0a\x42\x02\xbc\x74\x41\x06\xc9\x18\xa0\x83\x1b\x7b\x44\xc9\x29\x72\x00\xa0\xc8\x4d\xb0\x80\x54\xb9\x5e\x05\xa5\x40\x64\xf0\xf7\xda\xe3\x6c\x0f\x45\x64\x14\xf3\x73\x74\x03\x8e\xa8\x32\x2d\x12\x29\x3b\xdd\xe8\x3c\x47\x03\xcf\xb5\xe1\xed\x9e\xdd\xab\x90\x6d\xf8\x9f\x6b\xa4\xe0\x5c\x14\xfe\x85\x40\x01\xb1\xdf\x09\x06\x98\xd3\x40\x99\x6a\xa1\x33\x4d\xa9\xae\xf2\xb7\x12\x7e\xec\x92\xfd\xdb\xde\xfb\xeb\xda\xec\x40\x65\xe9\xbf\x19\x35\x9a\xf6\xb6\xc4\x9f\xcd\x3a\xd8\x92\x5c\x5f\x19\x55\xb6\x85\x28\x06\xeb\xd7\xec\x81\x2a\xe7\xd8\x05\x61\x4f\xac\xb1\x8c\x52\x3a\x7d\xa7\x0b\x5c\x63\xce\x39\x97\xd4\xd3\x24\x47\xec\x87\x0a\x2e\x33\x37\xef\x8d\x79\xa9\x6e\xb2\xdf\x59\x4a\x0f\xa3\xd7\xe4\x27\xc8\x35\xc5\x3c\xb3\x47\x72\xb9\x03\x65\x76\xfc\x6a\x76\x65\x6f\xde\x7e\xfe\xf2\xf6\xf2\xe2\xe6\xed\x1b\x98\x77\x96\xcb\x25\x72\x4a\x18\x8a\x72\xa3\xa2\xca\x92\xcc\x06\x91\x5d\xab\x78\xa4\x0d\xdc\xbd\x5a\xbc\xfa\xdb\x62\xdf\x29\x8d\x75\x2a\xf8\x7f\x92\x1d\xf6\xff\xb1\x67\xac\x9f\x63\x16\x39\x6a\x3b\xb1\x73\x40\x50\x18\x1f\x30\xab\x42\x3f\xa6\x83\xa4\xad\x52\xf0\xac\x61\x72\x93\x60\x11\x0a\x91\x52\xc7\x42\xb4\x44\x3a\x74\x3e\xa4\x55\x8e\x50\xec\xb8\x90\xc8\x8d\x54\x08\x81\x95\xd2\x05\x2d\xdc\xa1\xaf\x8a\xd0\xaa\x19\xe0\xb4\xe9\xd3\x25\xcd\x94\x1a\x57\x71\x9d\xd5\xb2\xa5\xa7\xb8\x37\x64\x9b\x84\x6b\x5a\xc6\x30\x48\x99\x9e\x8f\x7b\x25\x92\xaa\x28\x92\x09\xf6\x83\xd7\x28\x46\x3e\x24\x5b\xb9\xcc\x00\x1c\x6e\xae\x8e\x90\xdb\x9d\x8b\x94\x93\xb2\x58\x99\xaf\x4d\xca\x41\x69\x48\xbd\xc3\x31\xb9\xc8\xd5\x76\x93\xa3\xb7\x4d\x80\x7d\xb9\x12\xaa\x1b\xde\xc7\x9c\x17\x3e\xf8\xaf\xd1\x86\x4e\xfb\xdf\xfd\x54\x42\xde\x49\x0a\x73\xd0\x30\xae\x56\x5d\xd5\x12\x38\x46\x1c\x7c\xa7\x74\x51\x39\x4c\x50\x76\x22\x8f\x82\x54\x1f\x59\x22\x94\xe8\xbc\xf6\xb1\x1e\xe8\x83\x75\x6a\x8d\x49\xdd\x4c\xca\x23\x29\xdd\xf2\x95\x93\xee\x05\x85\xbc\x41\x8f\x03\xdc\xeb\x91\xde\x01\x67\x62\xd1\x57\xb7\x53\xbd\x21\xa1\x1c\xd2\xa9\xe1\x16\xff\x28\x87\x1e\xdb\xee\x1f\x55\x93\xee\x18\xc0\x63\x5b\xff\xa3\x64\x07\x47\x02\x1e\x33\x06\x30\x4a\xf9\x4f\x1c\x0f\x68\x5f\x07\xcd\x29\xb3\xf9\xa8\x4b\xe8\x88\xee\xba\x5a\xaf\xa5\xf8\xfd\x9f\x37\x37\x9f\x53\x0e\x42\x8f\x37\xcd\x0f\x82\x97\x95\x9f\xc1\x4b\xd0\x7d\x1c\x9a\xae\x58\x96\x1a\x73\x01\x2d\xa4\xf9\xfa\xa7\xc9\x5d\x0d\x21\xce\x66\xe9\x41\xe9\x62\xd4\x11\x76\x76\xf6\xf6\x21\xa0\xa1\x44\x35\x57\x41\x81\xf2\xde\x66\x9a\xc1\x71\x6d\xbe\x8e\x33\xaa\x85\x14\x64\x26\x74\x92\xf3\x2e\xd2\x0c\xd1\x6d\xd0\xc1\x83\xbd\x37\xdc\x36\x97\x37\xc8\xb2\xf6\x20\xe8\x28\xc5\xba\x12\x91\x62\x0c\xaf\xb0\x4e\xf9\x07\x9b\x8d\x99\x25\x94\xdc\xc7\xc5\x35\xef\x2c\x63\x8f\x68\x67\xf8\x90\x61\x19\xcb\x45\xb2\xe8\x3a\x27\x88\xdb\x21\x5e\x8f\xc9\xea\x70\xc4\x01\xc8\x54\xe5\xa7\xfe\x3f\xd0\x35\xbf\xe4\x47\xc4\x17\x83\x36\x59\x51\xe5\xe8\x61\x4b\x96\x13\x19\xd8\x92\xd2\x04\x61\x68\x24\x78\xcd\x9a\x19\x33\xe3\x95\x78\xe3\x05\x7c\xb4\x81\xe3\x6d\xfb\xbf\x8c\x05\x27\x89\xc6\xc2\x46\x5c\x0b\xe6\x71\x8b\xe3\x31\x6d\x32\x6a\xb7\xa8\x1e\xe4\xa5\x5c\xac\x36\x87\x6e\xda\x4f\xb0\x6e\x36\xa9\xf0\x14\x83\x7a\x77\xcc\x83\x12\x11\xde\xc6\x34\x3f\xe5\x62\x5b\x47\xe7\xac\x9b\x11\xc0\xa1\x88\xcb\x5a\x43\xea\xfe\x5f\xd7\x9f\x3e\x82\x47\xc7\x78\x40\x8d\x85\x95\xfd\xeb\x43\x23\x68\xc8\x49\x28\x26\x87\xd2\xfa\xb0\xd2\x0f\x90\x26\x34\xd8\xcd\x18\x76\x41\x47\x50\x54\x41\xdc\x27\xf9\xdc\x0b\x52\x24\xc1\xd2\xbf\xa3\xb3\x73\x6d\x72\x7c\xa0\xec\x0a\xde\x11\x47\x0e\x4b\x3c\x92\x2c\x4b\x54\x4e\xf4\x90\xab\x67\xdc\x16\xd3\x9c\xc1\x88\xae\xda\x55\xd4\x05\xc8\x07\x8a\x63\x03\x8c\xb4\x22\x13\x4f\x79\x15\x45\xf0\x6d\x55\x04\x5d\x16\x28\xdc\xa5\x6c\x25\x7a\x00\x4e\x13\xde\x4a\xa7\xe8\xa0\x82\xd0\xf5\x0d\xe0\xdb\x09\x49\xe6\xdb\x09\xcc\x63\x4b\x8e\xa4\x5f\xff\x18\x6b\x5d\x31\x57\x3a\x82\x62\xad\x30\x44\x99\x15\xfa\x1f\x2f\xff\xb9\x98\x78\xc5\x11\x34\xe3\x22\x56\xda\xf9\x10\x79\x18\xcb\xdd\x26\xbd\xe4\xdb\xc9\x61\x42\x07\xa3\x5c\x73\x6d\xd1\x7b\xb5\x9e\x40\xc1\xe9\xda\xab\xc5\x6c\xaa\xad\x32\x73\x87\x2a\xe7\x46\x6a\xeb\xbf\xf5\x7c\x0f\x49\xfe\x98\x3d\xcb\xed\x2c\xe1\x05\xb4\x23\x41\xac\x6e\x36\xb3\x1a\xca\xcf\x27\xa2\x43\x6b\xff\x96\xe7\xb6\x54\x8e\xee\xb0\xb5\x3d\x82\x59\x12\x02\x1e\xcd\xab\xad\xca\x36\xda\xe0\x14\xb7\x8e\xd8\x14\xf3\x73\x8f\x5b\xa9\x1c\x2b\x55\xdb\x94\x7f\xd3\x1d\xee\x18\x92\x1c\x30\x19\x7d\x11\xc6\xa0\xd5\xa8\x3b\xa5\x0b\x5a\xe3\x13\xf2\xed\x40\xa2\xd1\xbd\x6d\x38\xe1\x48\x97\x4c\xff\x3e\x26\x76\xf2\x13\x8d\xf7\xeb\x79\xfb\xc7\x06\x4e\x81\x74\x9d\x08\x39\xc5\xaa\xa3\x98\xb4\x3f\xaa\x3a\xb9\xa9\x53\xda\x15\x3d\xf1\x07\x6f\x0a\x3e\x19\xa9\x2b\x36\xe3\x56\x02\xe5\xb8\x83\x32\x49\xb7\xd5\xc9\x4b\x03\x22\xf5\xd2\x7e\xd1\x26\xff\x93\xc6\x55\xbf\x4b\x16\xd3\x25\x81\xb1\x91\xc6\x3f\x54\x14\xf0\x3c\x8e\xd9\xa1\xc3\x38\xb3\xac\xcd\xba\xc0\xf1\xd4\xbe\xa6\xca\x65\x62\xca\x6f\x97\xc9\xe9\x2c\x31\x7f\xf1\xc3\x0a\xcb\x4d\x0c\xee\x40\x8c\x4c\x89\x8d\x72\xec\x6a\xd5\xf4\x22\x66\xed\xa6\x47\x3d\x41\xd6\xf4\x88\x27\xb7\x56\x6b\x65\x6b\x3e\x56\x26\x6e\xf3\x05\x5c\x93\xde\x0a\x64\x88\x73\xd8\xd2\x53\x99\x76\x53\x4d\xaf\x86\x4b\x75\x41\xdd\xc6\x5a\x23\x67\xbb\x01\x41\x65\xfc\xc2\x79\x4c\xf0\xac\x4f\x2f\x39\x40\xb7\x13\xd0\xd2\x5a\x60\x63\xef\x65\x44\x28\x58\xb8\x57\x3a\xd4\x3b\x57\xb7\x07\x3d\xea\x06\x7b\xcb\x9a\x12\xea\x31\x39\x24\x1c\x95\x47\xd2\x55\xe9\x47\x78\xab\xaf\x57\x6f\xf6\x6d\x62\x31\xa6\xd0\x93\x7b\x6e\x46\xda\x46\x94\xfa\xd1\xc3\xce\xcd\xf0\x80\xff\x4b\xa5\x7f\xd8\x77\x1c\x0c\x73\x53\x6e\xfe\x09\x4e\x27\x8c\x67\xb8\xad\x3a\xf2\xf7\x9c\x54\x98\x20\xdc\x74\x37\xbf\xe7\xd4\xc2\x28\xe1\x3f\x3d\x3c\x1c\x14\xef\x01\x98\xfc\x68\x70\x1c\xdd\xfc\xa1\xb2\x5e\xed\xe5\xc6\x78\x75\xc4\xc2\xfb\xc7\x33\x46\x57\x7e\x7a\x1d\x94\xc9\x95\xcb\xa5\x8d\xd1\x1c\x4f\xf8\xd3\x05\x72\x54\x25\xc5\x92\x25\x54\xc7\x87\xeb\xf4\x40\xfb\x10\x87\x5e\xd5\x93\xab\x32\xe0\x0f\x85\xde\xea\xe9\xfc\x2f\x66\x69\xa6\x9e\x7e\xe6\xc4\xac\xae\x43\xc5\x09\xd8\xe8\xe7\x63\x9b\xe0\x50\x3c\x8b\xa3\x10\x1b\x95\x0a\x3b\x5c\x7b\xab\xd1\x38\x43\x8d\x1a\xe5\xdb\x52\xfd\x56\xe1\xe0\xe0\x5f\xfb\x8a\xdb\x4c\x67\x25\xb4\xf7\xfc\x90\x8d\x43\x13\x71\xa4\xd2\xee\x1f\x4b\x52\xd3\xbb\x97\x23\x28\xad\xbe\x63\xb0\xf5\x59\x17\xe1\x0b\x3e\xd4\xbd\xc6\x7a\x07\xd3\x0c\x4d\x3d\xd1\x4b\x91\x90\xf4\xf3\xb9\x6d\xe4\x03\xb9\x17\x51\xc7\xa6\xa3\x58\x5a\x3f\x3c\xf7\xdb\xbe\xa2\x68\x23\x67\x33\x6b\x56\x7a\x5d\x45\xd0\xc0\xf5\x9d\x8d\x32\x6b\x99\x15\x69\x6a\x18\x6a\x1a\xd9\xe2\x3d\x6c\xb5\xa9\x48\xac\xdc\xfb\x6e\xe6\x84\x9a\xf8\x96\x0a\xfa\x12\xf3\x93\x56\x1c\x00\x6a\x68\xa0\xf2\xe2\xd7\xa5\x63\x26\x9a\xda\x1a\x3d\x5a\x62\x1c\x77\xcb\xea\x19\xd4\x49\x9a\x51\x5b\xda\x15\x85\xd8\xa8\xc2\x19\x54\xa6\x40\xef\x61\x67\x2b\xd9\x87\xc3\x0c\xf5\xd0\xc9\xa2\xf6\x25\xf3\x9c\xf6\x16\x8d\x04\x09\x65\x04\xff\x24\xef\xf8\x04\xb8\xb2\xc3\xc1\xe3\x51\xc6\x75\x68\x1a\x3e\x75\x58\xf7\x2d\xf1\x9f\x9e\xfa\xba\x6d\x31\xcd\xb5\x28\xbc\x74\xbe\x32\x9d\x5f\x20\xca\x11\x73\xa4\xf1\xb7\xd4\x3f\x1a\x18\xa7\xea\xae\x34\x4d\xad\xb2\x94\xa3\xae\x0b\xdb\xa3\x0a\x2e\xe0\x57\x19\xd1\x8e\xd3\x92\x41\xba\xfe\x93\x64\x55\xed\x06\x5a\x4b\xe1\x3a\x21\xab\x24\x54\xa6\x6e\xbb\x2f\x55\x76\x7b\x8c\xc6\xa4\x39\xaf\x63\x0e\xb8\x34\x11\x61\x92\xe4\x13\x44\x8b\xcc\x1a\x29\xca\x65\xbb\x79\x1c\x81\x99\x2b\x93\xcf\x6b\xf7\x90\xed\x7e\x38\xeb\xf3\x58\xac\xde\x6b\x73\x7b\xb4\xc6\xa5\x07\x04\xa5\x7d\xfd\xf2\x7e\x1f\x9c\x1d\xd1\xda\x85\xe3\xce\x12\xfd\xc1\xa8\x74\xba\xa6\xf5\xc8\x4a\xd6\xfd\x26\x0e\x86\xd4\xc0\x65\x74\xf5\xba\x1e\x9b\x3f\x89\xdd\xe0\x93\x88\x8a\xa6\xcb\x5a\x53\xfd\xa1\xd1\x62\x16\x5c\xa4\x29\xc0\xac\x50\x4e\x9c\x83\x32\xd2\xb9\x93\x97\x4e\xa0\x8c\x1c\x61\x59\x05\xc8\x2d\x4a\x7f\xc9\xde\xa1\x73\x3a\x47\xd0\xa3\xc2\x3d\x28\x18\x79\xe9\xd1\xa0\xac\xc6\x8a\xad\x72\xcc\x02\x3e\x19\x04\xbb\x3a\x87\x93\xeb\x2a\xcb\xd0\xfb\x93\xa1\x71\x9d\x74\xd5\x5c\x7e\x6a\x34\x47\xf9\x3c\x1b\xa4\xec\xe9\x3b\x21\xf6\x84\x9e\x8e\x4d\x38\xcc\x47\x66\x5f\x46\x49\x15\x6a\x89\xfd\x1e\xe8\x13\x9f\x3c\xfe\xa0\x78\x34\x3c\x26\x6e\xb7\xb8\x13\xaf\x2c\xfd\xee\x7e\x1c\x09\x16\xac\x5b\x2b\xa3\x7f\x1f\x38\x28\x6c\x72\x20\x08\xb9\xb6\x4e\xff\x8e\xf0\x9c\xbf\x5f\x20\x67\x82\xb1\xc0\x2c\xbc\x68\x1d\xf4\x55\x3b\xd8\xf2\x08\x9b\xfc\xcb\x3a\x3f\x34\xfb\xe8\xb0\x2c\x78\xcc\x95\x2c\xa1\x1e\x27\xf4\x91\xa6\xbb\xd3\xd9\x40\x4f\xfe\x60\x22\x2d\x7c\x3d\xfa\xc0\xf0\x56\x19\xb5\xc6\x5c\x7a\x4d\xd3\x63\x90\x1f\xda\xb7\xc2\x56\x95\x1e\xee\xad\xbb\x5d\x15\xf6\x7e\xae\x65\xf4\x2b\x05\xec\x88\x63\x87\x0e\x96\xda\x55\x6a\x2b\xc9\xf9\x21\x87\x69\x0d\xe2\x75\x55\xa8\xa9\xc6\x4e\xb4\x26\x14\xee\x43\xb1\x8b\xf3\x3c\x23\xc0\x61\x63\x2b\x8f\xb7\x88\xa5\x36\x6b\x41\xfd\x32\x3d\x17\x76\x25\xa1\xb4\x62\x17\x8b\x53\xe6\x34\x80\x89\xfd\xe8\x78\xf2\xaa\x32\x39\x3a\x1f\x86\x20\x7c\x53\x30\x22\xbf\x95\x56\x96\xb4\x26\x65\x2b\xa7\xd2\x68\x9c\x75\x06\x43\xd3\x8f\x7d\x16\xb8\x66\xb6\x9d\x60\x79\x33\x2c\xab\xca\xb2\xd8\x41\xa9\xc2\x06\x0a\x7d\x8b\xf0\xed\x24\xd3\xf3\x2c\xff\x76\x22\xa0\x36\xe2\x78\xe1\x5f\x8f\x2c\x9f\xa9\xbc\x57\xbb\xda\x97\xd7\xd2\x88\x39\x4f\xb3\x7c\xd6\xf6\xbd\x73\xea\x43\x80\x24\x0d\xad\x7c\x33\xfb\x73\xa9\x3c\xf3\x27\x36\xc1\x9c\x68\xe1\xf7\x34\xe7\x77\xaf\xc3\x66\x68\xba\xdb\xd8\xa0\x33\xec\x4d\xff\x8d\xb4\xa1\xa7\x93\xcf\x43\x23\x3e\xdd\x90\x39\x39\xdf\xd3\xfa\x8a\x47\xab\xf9\x3c\xe6\x40\x1b\x6e\x70\xa2\xca\xe3\xde\xe9\x94\x3c\xc6\x1a\x1f\x31\xea\x84\x7b\x1e\x67\xf1\x1d\x27\xf0\xaf\xca\x8f\xd1\x64\x89\x73\x15\xd6\x96\xf3\x82\x3c\x7c\x7b\xc5\x51\x07\xe3\x31\x6e\xa4\x10\xa3\xdc\x8e\x2d\xcd\xa9\xac\x7f\x3a\x2c\xad\xb3\xb3\x3f\xd5\x5a\xf3\x12\xa5\x89\xa5\xd9\x07\xc6\x5c\x2e\x9e\xf5\x12\x83\x19\xa1\x19\x47\x96\x86\xe6\xd7\xe1\x70\x6c\x59\x0d\x7a\x1a\xb9\x06\xbd\x3f\x04\x37\xd2\xaf\xee\x08\x37\xba\xa5\x56\xc2\xa1\xba\xf6\x32\xb5\xda\x51\x48\x26\xae\xc9\x1d\xa1\x5c\xe2\x1d\x5d\xff\x2c\x54\x84\x0a\xb5\xed\x31\xc9\x09\x8c\xb8\x41\x8f\x47\x2c\x79\x94\xc1\x35\x26\x39\x62\xd1\x9f\xea\xc2\x7d\xfc\x92\x0e\xd1\xa6\x15\x37\x15\x7d\xa9\xf0\x16\xa8\x06\x8f\xaa\xa4\x35\x6b\x0f\x9d\xf0\xf0\x96\x1b\xe5\x4b\x24\xc7\x52\x7f\x82\x80\x2c\x83\x0f\x44\xf0\x09\x9b\x18\x85\x47\x48\xd6\x63\x5b\x71\xae\xd8\x21\x9c\x5e\x90\x77\x3c\x65\xaf\x73\xfa\x95\x8b\x98\xa7\xdf\xc5\xa1\xa0\xc7\xda\x4a\xdd\x86\x92\x96\x33\x1b\xa1\x7d\xca\x2c\x15\xcb\x6b\x19\xc1\x3d\xe1\xe0\x89\x99\xb1\xab\xfa\xb8\x49\xf4\xce\xf5\x09\x3c\xbd\xea\x0a\x20\x6e\x70\x90\xce\xa1\xb3\x81\x47\x6c\x7c\x42\xd5\xc7\xda\xbd\x43\x0d\xb8\x2e\xc2\xe2\x83\x2d\x29\x55\x8e\x47\x75\xc8\xf1\x6b\x03\xaa\xf9\xce\xc7\x02\xae\x7c\x73\xe4\x69\xf0\x1b\x01\x72\x0c\x42\x06\xa0\x65\x6c\x70\xd6\x9c\x70\xe6\xde\x67\xf3\x49\x91\xad\xda\xc9\xc7\x0d\xea\xe3\xea\x43\xba\xd9\x9c\x53\xc6\xee\x29\x14\x6e\x24\x95\x14\x58\x9c\x56\x21\x75\x0d\xdb\x9e\x6f\x31\x7c\xd8\x4b\x7b\x28\x9d\xde\x2a\xa7\xf9\x28\x44\x9c\x9b\x23\x55\xad\x0f\x71\x34\x67\x6e\x04\x1c\x76\x2b\x5d\x79\xfd\xf9\xad\xbe\xb6\x0c\x14\xe8\x7f\xa4\x89\xc2\xbc\x1f\x86\x81\x03\xfa\x51\x4b\x6a\x1a\x02\x7e\xac\x3f\xdc\xd2\x0e\xa0\xf2\x4b\x94\x3a\xaa\x6c\x23\x1c\xed\x6a\x45\x7f\xc3\x17\x26\xda\x41\xeb\x73\x30\x1e\x48\x49\xee\x54\x21\x32\x65\xf2\xdf\x4e\x72\x5c\xa9\xaa\x08\xdf\x4e\x9a\x5b\x67\x94\x06\xf6\x48\xb6\x6f\x8d\x1e\x2d\x53\xc6\x1a\x2e\xd3\x75\xc7\x72\x9b\x01\xbb\x54\x04\x22\x1f\x93\x74\xb4\x6f\x3c\xf2\xa5\x14\x02\xfd\xb9\x8c\xb4\x34\xab\x9e\xb7\x0e\xeb\xd9\xce\x99\xbc\xa6\x37\x19\x5f\xd2\xa3\x9b\xaa\x89\xf1\x4b\x05\xdf\x4c\x7d\x4a\x57\xc1\x9b\x8f\xd7\xff\xfb\xfe\xe2\x3f\xde\xbe\x1f\xec\xde\x4c\x14\x7d\x8e\x52\x96\x7a\xfd\xfe\xe8\xc3\x61\xf6\xde\xa0\xfb\x82\x7c\x68\x33\xeb\x03\xb2\x8e\xae\xbc\x8f\x67\x2f\x12\x77\x73\x2c\xc5\x5c\x96\xbb\xde\x99\xa4\x8b\xf7\xef\x47\x19\x14\xb1\x2c\x17\x9d\xb9\x4c\xc7\x47\x92\xea\xf9\xf2\xce\xf7\x6e\x22\x2f\xd7\xca\x2d\xd5\x1a\x21\x23\x18\x9e\x0d\x02\x95\xab\xd5\xfe\x89\x8e\x56\x12\xd2\x06\xf1\x33\x99\x67\x57\xa6\x99\xfd\xaa\x8b\xed\xc3\xc2\x8c\x95\x7b\xdb\x14\x8f\x13\xa5\x7a\xae\xa0\x75\x78\xac\xc1\x63\x8c\xe4\x86\xec\xe4\x86\x2b\x2d\x0d\x46\x6b\xcf\xf8\x61\x0d\x27\x5a\x44\x8f\x3c\xba\xfc\xb4\xc8\xba\x0b\xa3\xc9\x92\xe4\x6c\xef\x77\x45\x68\xfe\xca\xc6\x27\xd2\xb6\xf4\x19\x96\x23\x16\x41\x32\x75\x15\xce\xe0\xe2\xe3\x9b\xd4\x6f\x60\x8d\xad\x8f\xf7\x9e\xac\xac\x43\x02\xe4\x26\x4f\x74\xc7\xe6\xf7\xea\x23\xf5\x51\x01\x1a\x62\x8d\x20\x7a\x87\xe5\x6f\x71\x37\x67\x37\x30\x42\x54\xbe\x47\xc6\x5f\x5e\x48\xa9\x46\xb4\xa5\xd6\x89\xa0\x05\xbc\x11\x1f\xc6\x93\xfe\x2b\x55\x78\x5c\xc0\xcd\x18\xf4\xaa\xbf\xa9\x94\x0e\x22\x4b\xf7\x8c\x12\x5c\x0f\x27\xb2\xc2\x13\x28\xd1\x6d\xb5\x6f\x8b\x87\xf7\xd2\x4f\x4d\xe5\xb2\xe9\x60\x1f\xfc\xf5\xa7\x9f\xe0\xf9\x57\x13\x0f\xd9\x70\x95\xf1\xad\x09\x3a\xec\x5e\xb4\xbe\x09\x24\x3d\x95\x29\x41\x2f\xad\x2d\x50\x0d\xd5\x1f\x1b\xad\x7d\x8c\x84\xf7\x98\xc7\x26\x57\x1f\x8c\x38\xc2\x22\x8e\x5b\xdb\xf8\x8c\xc0\xc0\x84\xc0\xbe\xda\xff\xd9\x6d\xda\x03\x16\x35\x3e\x4a\x35\x80\xe7\x0e\xed\xe5\xc7\x81\xc8\x51\x6b\x1e\x9d\x6d\x99\x98\x6a\x79\x8a\x15\x8f\xcf\x9f\x4c\x2e\x78\xfc\xf0\xd7\xbc\xe5\x4d\x07\xfe\x49\x52\x1d\xf8\x79\x70\xa2\x6c\x4e\x5c\x79\x0a\x68\x7f\xa0\xbd\xd7\x3b\x01\x1d\xfb\x5b\x82\x72\xb8\xa2\xd4\x8c\xaf\xc4\x53\x8a\xe9\x20\x52\x1d\x08\x86\xab\x69\x47\x75\xf1\x46\x3a\x75\x7d\xa8\xd3\xe9\xdc\x7d\x68\x35\xd9\x09\x7b\xd9\x32\xe8\xad\xf6\x41\x67\xd0\xea\x5c\xcd\xe2\x03\xfc\x0e\x9e\xd7\x1a\xff\x60\x80\x1c\x45\x6e\xd2\x61\x6b\xda\x5f\xa1\xb4\x2e\xd5\x18\xea\xe4\xa4\xfe\x0c\x5e\x8f\xa4\x0c\xb2\x51\xa2\x10\x13\xc8\x58\x86\x56\xed\x19\x82\x47\x76\x0c\x53\x97\x90\x3f\x59\xb9\x6d\x7d\x47\x4d\x52\x6c\xe2\x81\x92\x0f\x05\x65\x55\xa1\xdc\xc0\xca\x07\xd4\xb8\xde\xc9\xf8\x37\x75\x3a\xed\xc7\xe3\xfa\xa5\xa3\x3d\xd2\xa7\x76\x95\x47\xf4\x28\x8f\x46\xbc\x63\xbd\xc8\xee\xe9\xb3\xe3\xfb\x8f\x1d\x7e\x0e\x98\xc7\x11\x3d\xc7\xd1\xb5\x0e\xb8\xcb\xae\x15\x93\xa3\x8c\x59\x51\xcc\xd4\xb5\x89\x1f\xce\x30\x79\xcc\xe2\xc4\xbe\xf7\xbe\x18\x38\x80\x9f\x19\x33\x37\xa5\xf5\xe6\xbb\x22\xdd\x2f\xd8\x59\x03\x5e\xfa\x61\xab\xaa\x68\xb2\xe4\x01\xb5\x6b\x59\x55\xeb\x9b\x75\xe9\x13\x86\xc1\x26\x9b\xb5\x06\x3e\x7f\xbd\xe9\x7c\x77\xb2\xad\xa6\x3d\xba\xc7\x74\xcd\xbf\x2f\x44\x1c\xa9\x44\x83\xbe\x39\x7d\x41\x7b\xfa\xa6\x5e\x5f\x72\xe0\xb6\xbd\x9f\xa2\xf3\xe5\xa7\xe6\xf1\xeb\xdd\x77\xaf\xb8\x5c\xff\x8a\x9f\x90\x89\xa1\x56\x55\x35\x9e\xdd\x8d\xbf\x34\xef\x54\x59\x86\x65\xc0\xfc\xe3\xfe\x37\xbd\xe3\x99\x97\xf4\x45\x6f\xfe\x33\xb3\x46\x4a\xb7\xfe\x1c\xfe\xf1\xcf\x67\x11\xea\xe6\xbf\xa6\xd5\xd0\x8f\xff\x17\x00\x00\xff\xff\x6a\xd1\x10\xc1\xbe\x5c\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5c\xeb\x73\xdb\x38\x92\xff\x9e\xbf\xa2\xcb\xfb\xc1\x49\x95\x24\x27\x93\xdd\xab\x5b\x7f\xf3\x39\xc9\x9c\x6f\xf2\xaa\xd8\x99\xab\xab\xcd\xd6\x15\x44\xb6\x24\xac\x29\x80\x03\x80\xb6\x35\x7f\xfd\x55\x77\x03\x7c\x88\x0f\xc9\x89\x67\xea\xf8\xcd\x32\xd9\x04\xfa\xf9\xeb\x07\xf8\x6c\x3e\x9f\x3f\x53\xa5\xfe\x15\x9d\xd7\xd6\x9c\x83\x2a\x35\x3e\x04\x34\xf4\x97\x5f\xdc\xfe\xbb\x5f\x68\x7b\x76\xf7\x6a\x89\x41\xbd\x7a\x76\xab\x4d\x7e\x0e\x97\x95\x0f\x76\xfb\x05\xbd\xad\x5c\x86\x6f\x70\xa5\x8d\x0e\xda\x9a\x67\x5b\x0c\x2a\x57\x41\x9d\x3f\x03\xc8\x1c\x2a\xfa\xf1\x46\x6f\xd1\x07\xb5\x2d\xcf\xc1\x54\x45\xf1\x0c\xc0\xa8\x2d\x9e\xc3\x16\xfd\x06\xfd\xe2\xb6\xda\xaa\x85\xb6\xcf\x7c\x89\x19\x3d\xb6\x76\xb6\x2a\xcf\x21\xfd\x2c\x77\x7b\xfa\x0f\x80\xbc\xfd\x03\xfa\x0d\xff\x59\x16\x95\x53\x45\xa2\xf4\x0c\xc0\x67\xb6\xc4\x73\xb8\x2c\x2a\x1f\xd0\x3d\x03\xb8\x53\x85\xce\x79\x15\x42\xc0\x96\x68\x2e\x3e\x5f\xfd\xfa\xfa\x3a\xdb\xe0\x56\xc9\x8f\x00\x39\xfa\xcc\xe9\x92\xef\x63\xf2\xa0\x3d\x84\x0d\x82\xdc\x06\x2b\xeb\xf8\x4f\x79\x11\x5c\x7c\xbe\x8a\x0f\x96\xce\x96\xe8\x82\x4e\x0b\xa4\xab\xc5\xcb\xfa\xb7\xbd\x57\x9c\xd2\x1a\xe4\x1e\xc8\x89\x7b\x28\xaf\xbb\x93\xdf\x30\x07\x2f\x2f\xb6\x2b\x08\x1b\xed\xc1\x61\xe9\xd0\xa3\x09\xbc\x97\x16\x59\xa0\x5b\x94\x01\xbb\xfc\x17\x66\x61\x01\xd7\xe8\x88\x08\xf8\x8d\xad\x8a\x1c\x32\x6b\xee\xd0\x05\x70\x98\xd9\xb5\xd1\xbf\xd7\x94\x3d\x04\xcb\xaf\x2c\x54\x40\x1f\x3a\x14\xb5\x09\xe8\x8c\x2a\x88\x7b\x15\xce\x40\x99\x1c\xb6\x6a\x07\x0e\xe9\x1d\x50\x99\x16\x35\xbe\xc5\x2f\xe0\x83\x75\x08\xda\xac\xec\x39\x6c\x42\x28\xfd\xf9\xd9\xd9\x5a\x87\xa4\x3d\x99\xdd\x6e\x2b\xa3\xc3\xee\x2c\xb3\x26\x38\xbd\xac\x82\x75\xfe\x2c\xc7\x3b\x2c\xce\x54\xa9\xe7\xbc\x4e\x13\x58\xe3\xb6\xf9\x5f\x5c\xd4\x2c\x7f\xda\x5a\x58\xd8\x91\x6c\x7d\x70\xda\xac\xeb\x9f\x59\x23\x46\xd9\xfc\x8b\x36\x39\x89\x52\xc5\xc7\x64\xb9\x0d\x37\xe9\x27\x62\xc2\x97\xb7\xd7\x37\x90\x5e\xca\x1c\xef\xb2\x98\x99\xdb\x3c\xe6\x1b\x3e\x13\x5f\xb4\x59\xa1\x13\x39\xad\x9c\xdd\x32\x45\x34\x79\x69\xb5\x09\xfc\x47\x56\x68\x34\x5d\x1e\xfb\x6a\xb9\xd5\x81\x04\xfb\x5b\x85\x3e\x90\x38\x16\x70\xa9\x8c\xb1\x01\x96\x08\x55\x99\xab\x80\xf9\x02\xae\x0c\x5c\xaa\x2d\x16\x97\xca\xe3\x53\x73\x99\x18\xea\xe7\xc4\xc1\xc3\x7c\x6e\x1b\x76\xba\x86\x94\x9f\x0d\x80\x76\xc1\x8a\xba\xf7\x0f\x00\x95\xe7\xec\x28\x54\xf1\x79\xe4\xe1\xd1\x15\x0c\x9a\x51\xf3\x26\x16\xb3\x81\xca\xf8\xe0\xaa\x2c\x54\x0e\x73\xb8\xc5\x5d\x94\xf8\x56\x95\xe0\x83\xa5\x1f\xef\x75\xd8\xf4\xde\xa8\xda\xd2\x57\x81\xc5\xba\x44\xf0\x18\x60\xb9\x03\x72\x87\x6c\x10\xc1\xda\x82\x2d\x87\x69\xb1\x61\x38\x0c\x4e\xe3\x1d\xf6\x49\xba\xa5\x0e\x4e\xb9\x5d\xcd\xbb\x05\xdc\x6c\x70\x07\xca\x21\x90\x98\x7f\xab\xd0\xed\xd4\xb2\x10\x3a\xd1\x60\x97\x08\xac\x64\xee\x0e\xf3\x1e\xc9\xfb\x0d\x1a\xd8\xda\x5c\xaf\x76\xa4\xb9\xa2\x96\x7d\xe3\x3b\x3f\x3b\xbb\xad\x96\xe8\x0c\x06\x64\xc5\xc8\x6d\xe6\xcf\x2a\x8f\x6e\xbe\xae\x74\x8e\x67\x2d\x01\x9d\x3e\x1b\x62\xbd\x50\xee\xfc\x2b\x13\x9f\xfa\x91\x5c\xf7\x94\x4c\x6e\x36\xc8\x1e\x5b\x5c\x17\xa6\xe7\xe0\x7e\xa3\xb3\x0d\xff\x12\xad\x69\x89\x85\x35\x6b\x51\xfc\x9b\x7d\x8b\xa3\x4b\x7b\xa8\x3c\xe6\xc4\xee\x5c\x7b\xb2\xd5\x4a\xfb\x4d\x2d\x28\xcf\x92\x04\x4f\xef\xe2\x17\x12\x17\x39\x56\x94\x2a\x23\x76\x40\xae\x57\x2b\x74\xfb\x96\xd7\xda\x8c\x97\x37\xc3\x4a\x63\xc1\x7e\x82\xc4\x42\x32\x57\x66\x77\xbf\x41\x87\xe0\xf4\x7a\x13\xc0\xd8\x7b\xa6\xae\x4a\xcd\x92\x71\x30\xb0\xdc\xb5\x65\x6f\x62\x41\xaf\x0d\xcb\x23\x80\x5e\x31\x35\x6d\x24\x16\x22\x58\x17\x2d\x3b\xd9\xfd\x62\x90\xfd\x03\x9a\xdf\x0f\xa6\x53\x42\x38\xb9\xdc\xbf\x5d\xbc\x60\xa8\xff\xec\xb9\x40\xd9\x58\xdf\x14\xf5\x16\x45\xef\xd8\xbf\x45\xd9\xdd\x2b\x1f\xb7\x44\x2e\x2a\x24\xd6\xad\x2b\xe5\x94\x09\x28\x42\x13\xfb\xe9\x8b\xd5\xc0\x46\x95\x25\x1a\x3f\x5f\xe2\x8a\x38\x65\x5d\x8e\x0e\x54\xe6\xac\xf7\xe0\xb1\x54\x8e\x79\x55\xa2\x13\x1d\x5d\xc0\x25\x3b\x50\xf1\xb6\xc6\xf6\x69\x12\x97\x79\x7d\x6c\xed\x69\x49\xf5\x1e\x31\xa7\xb7\x7e\x79\x77\xf9\xfa\xf5\xeb\xbf\x53\x30\xdf\xb2\x38\xb5\xa7\x9f\xbf\xde\x5c\x2e\xe0\x9b\xe9\xd1\xfc\x6c\xcb\x8a\x82\x63\x4e\x1e\x80\x39\xb4\xf3\x01\xb7\x0b\xf8\x82\x2a\x9f\x5b\x53\xec\x16\xf0\xb1\x2a\x0a\x06\x07\x85\xf6\x03\x86\xf8\x83\xfe\x39\xf9\x8d\x93\xbd\xb5\xd1\x06\x54\x38\x07\x52\xa4\x39\x09\xe8\x58\x25\xca\xb1\x40\xa2\xfe\xb3\x53\x19\x7e\x46\xa7\x6d\x7e\x8d\x99\x35\x79\xcf\x07\x77\xb4\xe9\x63\xb5\x5d\xa2\x23\x83\xf6\x72\x37\xa8\xa2\xb0\xf7\x98\x47\x5c\xd4\xe8\x45\xb0\xb0\x26\xda\xab\xaa\x28\x76\x7d\x5d\x42\xb7\xd5\x86\x64\x1b\x05\xaf\x03\xdc\xeb\xa2\x20\x4d\x71\xb8\xb5\x77\x44\x31\x05\xd0\xc4\xed\x4f\xa6\xd8\xb1\x7c\x49\x09\x7b\x24\xd3\x8e\xba\x7a\x5e\x78\x4b\x8f\x2c\xe0\x83\xda\x01\x49\x8a\x75\x71\x63\x5d\x40\x43\x1a\xdb\x48\x70\x84\xb3\xda\x84\x7f\xfb\xeb\x20\x57\x09\x1b\xad\xf7\xec\xa4\xb7\x88\x69\xdb\x7c\x33\xb4\xe6\x2f\xef\x2e\x81\xb5\x93\xbd\x03\x69\x27\x5b\x9e\x0a\xb5\xe3\x1c\x70\x39\x75\xcc\x4a\x5c\xe4\x95\xd0\x0e\xbb\x6e\x2d\x86\xb1\xc6\xcc\xc5\xa2\x55\x2d\xac\x51\xbe\x8a\x19\xb1\xab\x6a\x0c\x81\x22\xc9\x2c\x59\x10\xd9\x7d\xae\x1d\x66\x41\xe4\x14\x38\xa2\x2d\xfb\xd2\x57\x11\x06\x71\x14\x6c\x96\xae\x3d\xe0\x43\x89\x59\xa8\x9d\x46\xdc\x04\x3c\x37\x16\x28\x44\xa0\x83\x3b\xed\xf5\xb2\xe8\xc7\x58\xd6\x96\x9a\x14\x1b\xa1\x2c\x8c\x56\xe5\x50\x65\x9b\xb8\x1a\x0e\x0c\x2f\x40\xad\x02\x0a\x92\x67\xee\xea\xbe\x42\x85\x9a\x71\x33\xb0\x86\xe1\x00\xc2\x4a\x1b\x55\xe8\xdf\x09\xef\xd1\x3b\x78\xcd\xdb\x32\xec\x16\x70\xe1\x79\x89\xa0\xfc\xde\x8d\x3d\xc2\xfc\x20\xd9\xbd\xd2\x04\x56\x02\x6e\xfd\xac\xc3\xe6\x65\x61\xb3\x5b\x92\xdd\xa7\xf4\xda\x9e\x5e\x0d\x85\x48\x8f\x61\xd6\xf2\x7d\xc9\x45\x32\x88\x34\x24\x78\xeb\x12\x92\x59\x55\x2e\x6c\x28\x78\x99\x88\xfd\x57\x15\xe1\xa4\x59\x5f\x54\x45\xd8\xd8\x6a\xbd\x21\x03\x4d\x48\x28\x59\x0f\xc4\x54\xa8\xe6\x7a\xbc\x21\x49\xad\x74\xda\x0e\x84\x11\x2b\x6b\x24\xb6\x2f\xe0\x9d\x75\x80\x0f\x6a\x5b\x16\x94\x5d\xb0\x3e\xc5\x04\x83\x35\x4d\x20\x98\x82\xd2\xb2\x86\x45\xca\x43\x81\xe4\xf5\xcb\xe4\x92\x44\xab\x7e\xa9\x96\x74\xb3\xd8\x03\xc9\x9f\xf5\xde\xa3\xc9\x29\xcc\x35\xfa\x5e\xbb\xa2\xfd\x64\x8a\x2e\xaf\xd7\x82\xf5\x04\xbf\x88\xc8\x48\xf6\xda\xf0\x2f\xa5\xcd\x17\x70\x11\x35\x49\x85\xd6\x22\x66\xfc\xff\xb8\x88\x3e\x7a\xa3\x45\xd1\x5a\x40\xc1\x46\xb9\xbc\xbd\x88\xf4\xd2\xe7\xd7\x57\x3f\xff\x72\xf5\xfe\xfd\x8b\xde\xeb\x49\xad\xfb\x82\xe2\x55\x64\x05\x2a\x53\x95\xb3\xe8\x44\xd3\x22\x1b\x5f\x7a\xf1\xf9\x8a\x33\x09\xfe\x07\x87\xc4\x8c\xf1\x99\xc1\x70\x6f\xdd\x6d\x8f\x6c\xa9\x5c\x60\x98\xee\x67\x1d\xf7\x4e\x32\xf2\x81\xb6\x81\x0f\xa4\xce\xc9\x9c\xa2\x60\x59\x47\x67\x50\x99\xa0\xfb\x1e\x45\x19\x50\xf9\x56\x1b\xed\x83\x53\xc1\x3a\xd2\x23\x55\x05\xbb\x55\xa2\x35\x36\x43\xef\x21\x53\x94\x10\x0b\x63\xb0\xab\x67\x03\xfe\x8f\xc3\x4c\x13\x56\x08\x8b\xac\x12\x86\x9b\x35\xc2\xae\xad\x2c\x42\xd2\xb8\x9b\x8d\xea\x53\x14\xcb\x41\xd3\x38\x3d\xc2\x06\x63\x58\x60\xdf\x8d\xd6\x6f\x1a\x32\xd4\x16\xc5\x16\x82\xf8\x7f\x8e\x18\x1a\x87\x36\x19\xd3\x3e\x54\x9e\x3d\x0e\x7b\xc5\x14\xdd\x5b\xac\x6e\xac\xb8\x51\x4a\x87\x6b\xd2\x85\x5e\x0c\x06\x78\xab\xb2\x0d\xa0\x09\x6e\x17\x93\x3a\x9d\xd3\x1e\x57\x1a\x5d\x5d\x89\x71\xe8\x4b\x6b\x38\x2a\x40\x66\xb7\xa5\x35\x68\xa2\xe3\x20\x3b\x1b\x08\x95\xb5\x69\x08\xe5\x7a\x1d\xe4\x98\x59\x71\x06\x5d\x6e\x57\x67\x86\xe4\x6a\xac\x99\x1b\x5d\xcc\x98\xae\xc6\xe8\x26\x74\x0c\x15\xa4\xd0\x09\x81\x44\x8c\xb3\xbf\x61\x8e\x05\x8f\x4a\x82\xe5\x5f\xca\x39\xd5\x0d\xb3\x6b\x34\x84\x99\xf1\x60\x92\x76\xf2\x73\xeb\xce\xc8\x64\x5b\x4a\x62\x4e\x1e\x62\xa5\x1f\x66\x92\x7c\x75\x60\x43\x3f\x52\x10\xe0\x8b\xa4\xc8\x91\x1b\xfd\x5b\x15\xb3\xb1\x4f\x1f\xdf\xff\x0f\x5c\xbd\xe3\xa7\xf9\x2d\x82\x46\x36\xca\x37\x46\x56\x3a\x7b\xa7\xf3\x3e\x47\x40\xc4\xd1\x86\x30\xb4\x18\x71\xaf\x4c\xdd\x61\xa8\x9c\x11\xc8\xd0\x54\x58\x1a\x1c\x34\x9a\xf9\x85\x8d\x32\x0d\x99\x52\x79\x5f\xc3\x25\x89\x9f\x4c\x82\x11\xe4\x92\x35\x6b\xa9\x4d\x2c\x1a\xd4\x1b\xec\x47\x8c\x6a\xb5\xd2\x0f\x12\x82\xd2\x9e\x22\xb9\x4d\x44\x06\x9c\xa6\x36\xd5\x48\x70\x55\x81\x3e\xc1\x06\xe2\x4f\xdf\xb9\x09\x08\x49\xc5\xb7\x25\x42\x70\x95\xc9\xda\x5e\xa8\x40\xb3\x0e\x9b\xa4\xa2\xb2\x0a\xf6\x33\xda\x31\x6b\x7a\x34\xb7\xea\x56\x6c\x40\x16\x17\xe5\x65\x4d\x4b\xc6\xec\xef\x7a\xec\xf7\x25\x66\x64\x80\x03\x21\x88\xa0\xea\x06\x6b\x35\x90\x1c\x5c\x02\x44\x0c\x88\x09\x73\x12\x67\x3f\x7e\xba\x89\xc2\x03\x05\x7f\x7d\xf9\x77\x98\x0f\xc4\x75\x1f\x50\xe5\xb3\x3a\x3d\x40\xcd\xb0\x25\x3e\xf6\xd3\xcb\x57\x70\x29\xb9\x27\xc5\x90\xbf\xbd\x7c\x29\xd2\xf9\x82\xca\x5b\x13\x0b\x73\x64\xbf\xb6\x1a\x4a\x3e\x73\x9d\xa9\x20\x68\xa0\xad\xae\x19\x57\x5f\x22\x70\x5a\xd9\xca\xe4\x29\xdc\x0b\x0e\x2f\x0a\x1b\x02\xe6\x03\x58\x29\xee\x3f\x6a\x60\x2c\xe3\x38\x24\x1f\xf3\x3c\xd9\x54\xb1\xeb\x43\x4f\x5e\x08\x67\xa6\x03\x4a\x8a\xf0\x85\x28\xcc\x05\x66\x6c\x50\xe5\xe8\x5e\xb0\x68\x2e\xca\xb2\xd0\xb4\x75\x72\x2a\x7a\x05\xc9\x82\x39\xec\x25\x29\xf5\x0d\xea\x69\xe3\x8c\xce\x71\x5b\xda\x80\x26\xdb\xed\x87\x9a\x51\xb7\x15\x15\x64\xaf\x2c\x0e\xfb\xae\xe9\x02\x3c\x05\x4a\x42\x28\x46\xf2\xce\x4e\xa9\x42\xa5\x4d\x66\x2d\x82\x60\x57\x83\x3c\xcc\xd1\xb3\x25\xf8\xa0\x02\x2e\x8e\xc9\xe8\x9f\x24\x1f\xe4\x66\xc8\x31\x61\xf3\xe4\xc2\xb4\x6f\x96\x1a\x0d\x4b\xc0\x16\x45\x5d\x33\x43\xb3\xb2\x5c\xef\xf2\x76\x9b\xd6\x3c\xa0\xd8\x77\xca\x69\x65\x02\xa5\x8c\x31\xea\xa6\x9a\x51\x44\xdd\xdd\x9c\x50\x49\x7c\xb2\xab\xce\x72\x87\xfc\x25\x21\xa5\x3b\x29\x59\xee\x30\x80\xe2\x54\xcd\x76\x0a\x42\x02\xbc\x74\x41\x06\xc9\x18\xa0\x83\x1b\x7b\x44\xc9\x29\x72\x00\xa0\xc8\x4d\xb0\x80\x54\xb9\x5e\x05\xa5\x40\x64\xf0\xf7\xda\xe3\x6c\x0f\x45\x64\x14\xf3\x73\x74\x03\x8e\xa8\x32\x2d\x12\x29\x3b\xdd\xe8\x3c\x47\x03\xcf\xb5\xe1\xed\x9e\xdd\xab\x90\x6d\xf8\x9f\x6b\xa4\xe0\x5c\x14\xfe\x85\x40\x01\xb1\xdf\x09\x06\x98\xd3\x40\x99\x6a\xa1\x33\x4d\xa9\xae\xf2\xb7\x12\x7e\xec\x92\xfd\xdb\xde\xfb\xeb\xda\xec\x40\x65\xe9\xbf\x19\x35\x9a\xf6\xb6\xc4\x9f\xcd\x3a\xd8\x92\x5c\x5f\x19\x55\xb6\x85\x28\x06\xeb\xd7\xec\x81\x2a\xe7\xd8\x05\x61\x4f\xac\xb1\x8c\x52\x3a\x7d\xa7\x0b\x5c\x63\xce\x39\x97\xd4\xd3\x24\x47\xec\x87\x0a\x2e\x33\x37\xef\x8d\x79\xa9\x6e\xb2\xdf\x59\x4a\x0f\xa3\xd7\xe4\x27\xc8\x35\xc5\x3c\xb3\x47\x72\xb9\x03\x65\x76\xfc\x6a\x76\x65\x6f\xde\x7e\xfe\xf2\xf6\xf2\xe2\xe6\xed\x1b\x98\x77\x96\xcb\x25\x72\x4a\x18\x8a\x72\xa3\xa2\xca\x92\xcc\x06\x91\x5d\xab\x78\xa4\x0d\xdc\xbd\x5a\xbc\xfa\xdb\x62\xdf\x29\x8d\x75\x2a\xf8\x7f\x92\x1d\xf6\xff\xb1\x67\xac\x9f\x63\x16\x39\x6a\x3b\xb1\x73\x40\x50\x18\x1f\x30\xab\x42\x3f\xa6\x83\xa4\xad\x52\xf0\xac\x61\x72\x93\x60\x11\x0a\x91\x52\xc7\x42\xb4\x44\x3a\x74\x3e\xa4\x55\x8e\x50\xec\xb8\x90\xc8\x8d\x54\x08\x81\x95\xd2\x05\x2d\xdc\xa1\xaf\x8a\xd0\xaa\x19\xe0\xb4\xe9\xd3\x25\xcd\x94\x1a\x57\x71\x9d\xd5\xb2\xa5\xa7\xb8\x37\x64\x9b\x84\x6b\x5a\xc6\x30\x48\x99\x9e\x8f\x7b\x25\x92\xaa\x28\x92\x09\xf6\x83\xd7\x28\x46\x3e\x24\x5b\xb9\xcc\x00\x1c\x6e\xae\x8e\x90\xdb\x9d\x8b\x94\x93\xb2\x58\x99\xaf\x4d\xca\x41\x69\x48\xbd\xc3\x31\xb9\xc8\xd5\x76\x93\xa3\xb7\x4d\x80\x7d\xb9\x12\xaa\x1b\xde\xc7\x9c\x17\x3e\xf8\xaf\xd1\x86\x4e\xfb\xdf\xfd\x54\x42\xde\x49\x0a\x73\xd0\x30\xae\x56\x5d\xd5\x12\x38\x46\x1c\x7c\xa7\x74\x51\x39\x4c\x50\x76\x22\x8f\x82\x54\x1f\x59\x22\x94\xe8\xbc\xf6\xb1\x1e\xe8\x83\x75\x6a\x8d\x49\xdd\x4c\xca\x23\x29\xdd\xf2\x95\x93\xee\x05\x85\xbc\x41\x8f\x03\xdc\xeb\x91\xde\x01\x67\x62\xd1\x57\xb7\x53\xbd\x21\xa1\x1c\xd2\xa9\xe1\x16\xff\x28\x87\x1e\xdb\xee\x1f\x55\x93\xee\x18\xc0\x63\x5b\xff\xa3\x64\x07\x47\x02\x1e\x33\x06\x30\x4a\xf9\x4f\x1c\x0f\x68\x5f\x07\xcd\x29\xb3\xf9\xa8\x4b\xe8\x88\xee\xba\x5a\xaf\xa5\xf8\xfd\x9f\x37\x37\x9f\x53\x0e\x42\x8f\x37\xcd\x0f\x82\x97\x95\x9f\xc1\x4b\xd0\x7d\x1c\x9a\xae\x58\x96\x1a\x73\x01\x2d\xa4\xf9\xfa\xa7\xc9\x5d\x0d\x21\xce\x66\xe9\x41\xe9\x62\xd4\x11\x76\x76\xf6\xf6\x21\xa0\xa1\x44\x35\x57\x41\x81\xf2\xde\x66\x9a\xc1\x71\x6d\xbe\x8e\x33\xaa\x85\x14\x64\x26\x74\x92\xf3\x2e\xd2\x0c\xd1\x6d\xd0\xc1\x83\xbd\x37\xdc\x36\x97\x37\xc8\xb2\xf6\x20\xe8\x28\xc5\xba\x12\x91\x62\x0c\xaf\xb0\x4e\xf9\x07\x9b\x8d\x99\x25\x94\xdc\xc7\xc5\x35\xef\x2c\x63\x8f\x68\x67\xf8\x90\x61\x19\xcb\x45\xb2\xe8\x3a\x27\x88\xdb\x21\x5e\x8f\xc9\xea\x70\xc4\x01\xc8\x54\xe5\xa7\xfe\x3f\xd0\x35\xbf\xe4\x47\xc4\x17\x83\x36\x59\x51\xe5\xe8\x61\x4b\x96\x13\x19\xd8\x92\xd2\x04\x61\x68\x24\x78\xcd\x9a\x19\x33\xe3\x95\x78\xe3\x05\x7c\xb4\x81\xe3\x6d\xfb\xbf\x8c\x05\x27\x89\xc6\xc2\x46\x5c\x0b\xe6\x71\x8b\xe3\x31\x6d\x32\x6a\xb7\xa8\x1e\xe4\xa5\x5c\xac\x36\x87\x6e\xda\x4f\xb0\x6e\x36\xa9\xf0\x14\x83\x7a\x77\xcc\x83\x12\x11\xde\xc6\x34\x3f\xe5\x62\x5b\x47\xe7\xac\x9b\x11\xc0\xa1\x88\xcb\x5a\x43\xea\xfe\x5f\xd7\x9f\x3e\x82\x47\xc7\x78\x40\x8d\x85\x95\xfd\xeb\x43\x23\x68\xc8\x49\x28\x26\x87\xd2\xfa\xb0\xd2\x0f\x90\x26\x34\xd8\xcd\x18\x76\x41\x47\x50\x54\x41\xdc\x27\xf9\xdc\x0b\x52\x24\xc1\xd2\xbf\xa3\xb3\x73\x6d\x72\x7c\xa0\xec\x0a\xde\x11\x47\x0e\x4b\x3c\x92\x2c\x4b\x54\x4e\xf4\x90\xab\x67\xdc\x16\xd3\x9c\xc1\x88\xae\xda\x55\xd4\x05\xc8\x07\x8a\x63\x03\x8c\xb4\x22\x13\x4f\x79\x15\x45\xf0\x6d\x55\x04\x5d\x16\x28\xdc\xa5\x6c\x25\x7a\x00\x4e\x13\xde\x4a\xa7\xe8\xa0\x82\xd0\xf5\x0d\xe0\xdb\x09\x49\xe6\xdb\x09\xcc\x63\x4b\x8e\xa4\x5f\xff\x18\x6b\x5d\x31\x57\x3a\x82\x62\xad\x30\x44\x99\x15\xfa\x1f\x2f\xff\xb9\x98\x78\xc5\x11\x34\xe3\x22\x56\xda\xf9\x10\x79\x18\xcb\xdd\x26\xbd\xe4\xdb\xc9\x61\x42\x07\xa3\x5c\x73\x6d\xd1\x7b\xb5\x9e\x40\xc1\xe9\xda\xab\xc5\x6c\xaa\xad\x32\x73\x87\x2a\xe7\x46\x6a\xeb\xbf\xf5\x7c\x0f\x49\xfe\x98\x3d\xcb\xed\x2c\xe1\x05\xb4\x23\x41\xac\x6e\x36\xb3\x1a\xca\xcf\x27\xa2\x43\x6b\xff\x96\xe7\xb6\x54\x8e\xee\xb0\xb5\x3d\x82\x59\x12\x02\x1e\xcd\xab\xad\xca\x36\xda\xe0\x14\xb7\x8e\xd8\x14\xf3\x73\x8f\x5b\xa9\x1c\x2b\x55\xdb\x94\x7f\xd3\x1d\xee\x18\x92\x1c\x30\x19\x7d\x11\xc6\xa0\xd5\xa8\x3b\xa5\x0b\x5a\xe3\x13\xf2\xed\x40\xa2\xd1\xbd\x6d\x38\xe1\x48\x97\x8c\x00\x3f\x26\x76\xf2\x13\x8d\xf7\xeb\x79\xfb\xc7\x06\x4e\x81\x74\x9d\x08\x39\xc5\xaa\xa3\x98\xb4\x3f\xaa\x3a\xb9\xa9\x53\xda\x15\x3d\xf1\x07\x6f\x0a\x3e\x19\xa9\x2b\x36\xe3\x56\x02\xe5\xb8\x83\x32\x49\xb7\xd5\xc9\x4b\x03\x22\xf5\xd2\x7e\xd1\x26\xff\x93\xc6\x55\xbf\x4b\x16\xd3\x25\x81\xb1\x91\xc6\x3f\x54\x14\xf0\x3c\x8e\xd9\xa1\xc3\x38\xb3\xac\xcd\xba\xc0\xf1\xd4\xbe\xa6\xca\x65\x62\xca\x6f\x97\xc9\xe9\x2c\x31\x7f\xf1\xc3\x0a\xcb\x4d\x0c\xee\x40\x8c\x4c\x89\x8d\x72\xec\x6a\xd5\xf4\x22\x66\xed\xa6\x47\x3d\x41\xd6\xf4\x88\x27\xb7\x56\x6b\x65\x6b\x3e\x56\x26\x6e\xf3\x05\x5c\x93\xde\x0a\x64\x88\x73\xd8\xd2\x53\x99\x76\x53\x4d\xaf\x86\x4b\x75\x41\xdd\xc6\x5a\x23\x67\xbb\x01\x41\x65\xfc\xc2\x79\x4c\xf0\xac\x4f\x2f\x39\x40\xb7\x13\xd0\xd2\x5a\x60\x63\xef\x65\x44\x28\x58\xb8\x57\x3a\xd4\x3b\x57\xb7\x07\x3d\xea\x06\x7b\xcb\x9a\x12\xea\x31\x39\x24\x1c\x95\x47\xd2\x55\xe9\x47\x78\xab\xaf\x57\x6f\xf6\x6d\x62\x31\xa6\xd0\x93\x7b\x6e\x46\xda\x46\x94\xfa\xd1\xc3\xce\xcd\xf0\x80\xff\x4b\xa5\x7f\xd8\x77\x1c\x0c\x73\x53\x6e\xfe\x09\x4e\x27\x8c\x67\xb8\xad\x3a\xf2\xf7\x9c\x54\x98\x20\xdc\x74\x37\xbf\xe7\xd4\xc2\x28\xe1\x3f\x3d\x3c\x1c\x14\xef\x01\x98\xfc\x68\x70\x1c\xdd\xfc\xa1\xb2\x5e\xed\xe5\xc6\x78\x75\xc4\xc2\xfb\xc7\x33\x46\x57\x7e\x7a\x1d\x94\xc9\x95\xcb\xa5\x8d\xd1\x1c\x4f\xf8\xd3\x05\x72\x54\x25\xc5\x92\x25\x54\xc7\x87\xeb\xf4\x40\xfb\x10\x87\x5e\xd5\x93\xab\x32\xe0\x0f\x85\xde\xea\xe9\xfc\x2f\x66\x69\xa6\x9e\x7e\xe6\xc4\xac\xae\x43\xc5\x09\xd8\xe8\xe7\x63\x9b\xe0\x50\x3c\x8b\xa3\x10\x1b\x95\x0a\x3b\x5c\x7b\xab\xd1\x38\x43\x8d\x1a\xe5\xdb\x52\xfd\x56\xe1\xe0\xe0\x5f\xfb\x8a\xdb\x4c\x67\x25\xb4\xf7\xfc\x90\x8d\x43\x13\x71\xa4\xd2\xee\x1f\x4b\x52\xd3\xbb\x97\x23\x28\xad\xbe\x63\xb0\xf5\x59\x17\xe1\x0b\x3e\xd4\xbd\xc6\x7a\x07\xd3\x0c\x4d\x3d\xd1\x4b\x91\x90\xf4\xf3\xb9\x6d\xe4\x03\xb9\x17\x51\xc7\xa6\xa3\x58\x5a\x3f\x3c\xf7\xdb\xbe\xa2\x68\x23\x67\x33\x6b\x56\x7a\x5d\x45\xd0\xc0\xf5\x9d\x8d\x32\x6b\x99\x15\x69\x6a\x18\x6a\x1a\xd9\xe2\x3d\x6c\xb5\xa9\x48\xac\xdc\xfb\x6e\xe6\x84\x9a\xf8\x96\x0a\xfa\x12\xf3\x93\x56\x1c\x00\x6a\x68\xa0\xf2\xe2\xd7\xa5\x63\x26\x9a\xda\x1a\x3d\x5a\x62\x1c\x77\xcb\xea\x19\xd4\x49\x9a\x51\x5b\xda\x15\x85\xd8\xa8\xc2\x19\x54\xa6\x40\xef\x61\x67\x2b\xd9\x87\xc3\x0c\xf5\xd0\xc9\xa2\xf6\x25\xf3\x9c\xf6\x16\x8d\x04\x09\x65\x04\xff\x24\xef\xf8\x04\xb8\xb2\xc3\xc1\xe3\x51\xc6\x75\x68\x1a\x3e\x75\x58\xf7\x2d\xf1\x9f\x9e\xfa\xba\x6d\x31\xcd\xb5\x28\xbc\x74\xbe\x32\x9d\x5f\x20\xca\x11\x73\xa4\xf1\xb7\xd4\x3f\x1a\x18\xa7\xea\xae\x34\x4d\xad\xb2\x94\xa3\xae\x0b\xdb\xa3\x0a\x2e\xe0\x57\x19\xd1\x8e\xd3\x92\x41\xba\xfe\x93\x64\x55\xed\x06\x5a\x4b\xe1\x3a\x21\xab\x24\x54\xa6\x6e\xbb\x2f\x55\x76\x7b\x8c\xc6\xa4\x39\xaf\x63\x0e\xb8\x34\x11\x61\x92\xe4\x13\x44\x8b\xcc\x1a\x29\xca\x65\xbb\x79\x1c\x81\x99\x2b\x93\xcf\x6b\xf7\x90\xed\x7e\x38\xeb\xf3\x58\xac\xde\x6b\x73\x7b\xb4\xc6\xa5\x07\x04\xa5\x7d\xfd\xf2\x7e\x1f\x9c\x1d\xd1\xda\x85\xe3\xce\x12\xfd\xc1\xa8\x74\xba\xa6\xf5\xc8\x4a\xd6\xfd\x26\x0e\x86\xd4\xc0\x65\x74\xf5\xba\x1e\x9b\x3f\x89\xdd\xe0\x93\x88\x8a\xa6\xcb\x5a\x53\xfd\xa1\xd1\x62\x16\x5c\xa4\x29\xc0\xac\x50\x4e\x9c\x83\x32\xd2\xb9\x93\x97\x4e\xa0\x8c\x1c\x61\x59\x05\xc8\x2d\x4a\x7f\xc9\xde\xa1\x73\x3a\x47\xd0\xa3\xc2\x3d\x28\x18\x79\xe9\xd1\xa0\xac\xc6\x8a\xad\x72\xcc\x02\x3e\x19\x04\xbb\x3a\x87\x93\xeb\x2a\xcb\xd0\xfb\x93\xa1\x71\x9d\x74\xd5\x5c\x7e\x6a\x34\x47\xf9\x3c\x1b\xa4\xec\xe9\x3b\x21\xf6\x84\x9e\x8e\x4d\x38\xcc\x47\x66\x5f\x46\x49\x15\x6a\x89\xfd\x1e\xe8\x13\x9f\x3c\xfe\xa0\x78\x34\x3c\x26\x6e\xb7\xb8\x13\xaf\x2c\xfd\xee\x7e\x1c\x09\x16\xac\x5b\x2b\xa3\x7f\x1f\x38\x28\x6c\x72\x20\x08\xb9\xb6\x4e\xff\x8e\xf0\x9c\x3f\x62\x20\x67\x82\xb1\xc0\x2c\xbc\x68\x1d\xf4\x55\x3b\xd8\xf2\x08\x9b\xfc\xcb\x3a\x3f\x34\xfb\xe8\xb0\x2c\x78\xcc\x95\x2c\xa1\x1e\x27\xf4\x91\xa6\xbb\xd3\xd9\x40\x4f\xfe\x60\x22\x2d\x7c\x3d\xfa\xc0\xf0\x56\x19\xb5\xc6\x5c\x7a\x4d\xd3\x63\x90\x1f\xda\xb7\xc2\x56\x95\x1e\xee\xad\xbb\x5d\x15\xf6\x7e\xae\x65\xf4\x2b\x05\xec\x88\x63\x87\x0e\x96\xda\x55\x6a\x2b\xc9\xf9\x21\x87\x69\x0d\xe2\x75\x55\xa8\xa9\xc6\x4e\xb4\x26\x14\xee\x43\xb1\x8b\xf3\x3c\x23\xc0\x61\x63\x2b\x8f\xb7\x88\xa5\x36\x6b\x41\xfd\x32\x3d\x17\x76\x25\xa1\xb4\x62\x17\x8b\x53\xe6\x34\x80\x89\xfd\xe8\x78\xf2\xaa\x32\x39\x3a\x1f\x86\x20\x7c\x53\x30\x22\xbf\x95\x56\x96\xb4\x26\x65\x2b\xa7\xd2\x68\x9c\x75\x06\x43\xd3\x8f\x7d\x16\xb8\x66\xb6\x9d\x60\x79\x33\x2c\xab\xca\xb2\xd8\x41\xa9\xc2\x06\x0a\x7d\x8b\xf0\xed\x24\xd3\xf3\x2c\xff\x76\x22\xa0\x36\xe2\x78\xe1\x5f\x8f\x2c\x9f\xa9\xbc\x57\xbb\xda\x97\xd7\xd2\x88\x39\x4f\xb3\x7c\xd6\xf6\xbd\x73\xea\x43\x80\x24\x0d\xad\x7c\x33\xfb\x73\xa9\x3c\xf3\x27\x36\xc1\x9c\x68\xe1\xf7\x34\xe7\x77\xaf\xc3\x66\x68\xba\xdb\xd8\xa0\x33\xec\x4d\xff\x8d\xb4\xa1\xa7\x93\xcf\x43\x23\x3e\xdd\x90\x39\x39\xdf\xd3\xfa\x8a\x47\xab\xf9\x3c\xe6\x40\x1b\x6e\x70\xa2\xca\xe3\xde\xe9\x94\x3c\xc6\x1a\x1f\x31\xea\x84\x7b\x1e\x67\xf1\x1d\x27\xf0\xaf\xca\x8f\xd1\x64\x89\x73\x15\xd6\x96\xf3\x82\x3c\x7c\x7b\xc5\x51\x07\xe3\x31\x6e\xa4\x10\xa3\xdc\x8e\x2d\xcd\xa9\xac\x7f\x3a\x2c\xad\xb3\xb3\x3f\xd5\x5a\xf3\x12\xa5\x89\xa5\xd9\x07\xc6\x5c\x2e\x9e\xf5\x12\x83\x19\xa1\x19\x47\x96\x86\xe6\xd7\xe1\x70\x6c\x59\x0d\x7a\x1a\xb9\x06\xbd\x3f\x04\x37\xd2\xaf\xee\x08\x37\xba\xa5\x56\xc2\xa1\xba\xf6\x32\xb5\xda\x51\x48\x26\xae\xc9\x1d\xa1\x5c\xe2\x1d\x5d\xff\x2c\x54\x84\x0a\xb5\xed\x31\xc9\x09\x8c\xb8\x41\x8f\x47\x2c\x79\x94\xc1\x35\x26\x39\x62\xd1\x9f\xea\xc2\x7d\xfc\x92\x0e\xd1\xa6\x15\x37\x15\x7d\xa9\xf0\x16\xa8\x06\x8f\xaa\xa4\x35\x6b\x0f\x9d\xf0\xf0\x96\x1b\xe5\x4b\x24\xc7\x52\x7f\x82\x80\x2c\x83\x0f\x44\xf0\x09\x9b\x18\x85\x47\x48\xd6\x63\x5b\x71\xae\xd8\x21\x9c\x5e\x90\x77\x3c\x65\xaf\x73\xfa\x95\x8b\x98\xa7\xdf\xc5\xa1\xa0\xc7\xda\x4a\xdd\x86\x92\x96\x33\x1b\xa1\x7d\xca\x2c\x15\xcb\x6b\x19\xc1\x3d\xe1\xe0\x89\x99\xb1\xab\xfa\xb8\x49\xf4\xce\xf5\x09\x3c\xbd\xea\x0a\x20\x6e\x70\x90\xce\xa1\xb3\x81\x47\x6c\x7c\x42\xd5\xc7\xda\xbd\x43\x0d\xb8\x2e\xc2\xe2\x83\x2d\x29\x55\x8e\x47\x75\xc8\xf1\x6b\x03\xaa\xf9\xce\xc7\x02\xae\x7c\x73\xe4\x69\xf0\x1b\x01\x72\x0c\x42\x06\xa0\x65\x6c\x70\xd6\x9c\x70\xe6\xde\x67\xf3\x49\x91\xad\xda\xc9\xc7\x0d\xea\xe3\xea\x43\xba\xd9\x9c\x53\xc6\xee\x29\x14\x6e\x24\x95\x14\x58\x9c\x56\x21\x75\x0d\xdb\x9e\x6f\x31\x7c\xd8\x4b\x7b\x28\x9d\xde\x2a\xa7\xf9\x28\x44\x9c\x9b\x23\x55\xad\x0f\x71\x34\x67\x6e\x04\x1c\x76\x2b\x5d\x79\xfd\x0d\xae\xbe\xb6\x0c\x14\xe8\x7f\xa4\x89\xc2\xbc\x1f\x86\x81\x03\xfa\x51\x4b\x6a\x1a\x02\x7e\xac\x3f\xdc\xd2\x0e\xa0\xf2\x4b\x94\x3a\xaa\x6c\x23\x1c\xed\x6a\x45\x7f\xc3\x17\x26\xda\x41\xeb\x73\x30\x1e\x48\x49\xee\x54\x21\x32\x65\xf2\xdf\x4e\x72\x5c\xa9\xaa\x08\xdf\x4e\x9a\x5b\x67\x94\x06\xf6\x48\xb6\x6f\x8d\x1e\x2d\x53\xc6\x1a\x2e\xd3\x75\xc7\x72\x9b\x01\xbb\x54\x04\x22\x1f\x93\x74\xb4\x6f\x3c\xf2\xa5\x14\x02\xfd\xb9\x8c\xb4\x34\xab\x9e\xb7\x0e\xeb\xd9\xce\x99\xbc\xa6\x37\x19\x5f\xd2\xa3\x9b\xaa\x89\xf1\x4b\x05\xdf\x4c\x7d\x4a\x57\xc1\x9b\x8f\xd7\xff\xfb\xfe\xe2\x3f\xde\xbe\x1f\xec\xde\x4c\x14\x7d\x8e\x52\x96\x7a\xfd\xfe\xe8\xc3\x61\xf6\xde\xa0\xfb\x82\x7c\x68\x33\xeb\x03\xb2\x8e\xae\xbc\x8f\x67\x2f\x12\x77\x73\x2c\xc5\x5c\x96\xbb\xde\x99\xa4\x8b\xf7\xef\x47\x19\x14\xb1\x2c\x17\x9d\xb9\x4c\xc7\x47\x92\xea\xf9\xf2\xce\xf7\x6e\x22\x2f\xd7\xca\x2d\xd5\x1a\x21\x23\x18\x9e\x0d\x02\x95\xab\xd5\xfe\x89\x8e\x56\x12\xd2\x06\xf1\x33\x99\x67\x57\xa6\x99\xfd\xaa\x8b\xed\xc3\xc2\x8c\x95\x7b\xdb\x14\x8f\x13\xa5\x7a\xae\xa0\x75\x78\xac\xc1\x63\x8c\xe4\x86\xec\xe4\x86\x2b\x2d\x0d\x46\x6b\xcf\xf8\x61\x0d\x27\x5a\x44\x8f\x3c\xba\xfc\xb4\xc8\xba\x0b\xa3\xc9\x92\xe4\x6c\xef\x77\x45\x68\xfe\xca\xc6\x27\xd2\xb6\xf4\x19\x96\x23\x16\x41\x32\x75\x15\xce\xe0\xe2\xe3\x9b\xd4\x6f\x60\x8d\xad\x8f\xf7\x9e\xac\xac\x43\x02\xe4\x26\x4f\x74\xc7\xe6\xf7\xea\x23\xf5\x51\x01\x1a\x62\x8d\x20\x7a\x87\xe5\x6f\x71\x37\x67\x37\x30\x42\x54\xbe\x47\xc6\x5f\x5e\x48\xa9\x46\xb4\xa5\xd6\x89\xa0\x05\xbc\x11\x1f\xc6\x93\xfe\x2b\x55\x78\x5c\xc0\xcd\x18\xf4\xaa\xbf\xa9\x94\x0e\x22\x4b\xf7\x8c\x12\x5c\x0f\x27\xb2\xc2\x13\x28\xd1\x6d\xb5\x6f\x8b\x87\xf7\xd2\x4f\x4d\xe5\xb2\xe9\x60\x1f\xfc\xf5\xa7\x9f\xe0\xf9\x57\x13\x0f\xd9\x70\x95\xf1\xad\x09\x3a\xec\x5e\xb4\xbe\x09\x24\x3d\x95\x29\x41\x2f\xad\x2d\x50\x0d\xd5\x1f\x1b\xad\x7d\x8c\x84\xf7\x98\xc7\x26\x57\x1f\x8c\x38\xc2\x22\x8e\x5b\xdb\xf8\x8c\xc0\xc0\x84\xc0\xbe\xda\xff\xd9\x6d\xda\x03\x16\x35\x3e\x4a\x35\x80\xe7\x0e\xed\xe5\xc7\x81\xc8\x51\x6b\x1e\x9d\x6d\x99\x98\x6a\x79\x8a\x15\x8f\xcf\x9f\x4c\x2e\x78\xfc\xf0\xd7\xbc\xe5\x4d\x07\xfe\x49\x52\x1d\xf8\x79\x70\xa2\x6c\x4e\x5c\x79\x0a\x68\x7f\xa0\xbd\xd7\x3b\x01\x1d\xfb\x5b\x82\x72\xb8\xa2\xd4\x8c\xaf\xc4\x53\x8a\xe9\x20\x52\x1d\x08\x86\xab\x69\x47\x75\xf1\x46\x3a\x75\x7d\xa8\xd3\xe9\xdc\x7d\x68\x35\xd9\x09\x7b\xd9\x32\xe8\xad\xf6\x41\x67\xd0\xea\x5c\xcd\xe2\x03\xfc\x0e\x9e\xd7\x1a\xff\x60\x80\x1c\x45\x6e\xd2\x61\x6b\xda\x5f\xa1\xb4\x2e\xd5\x18\xea\xe4\xa4\xfe\x0c\x5e\x8f\xa4\x0c\xb2\x51\xa2\x10\x13\xc8\x58\x86\x56\xed\x19\x82\x47\x76\x0c\x53\x97\x90\x3f\x59\xb9\x6d\x7d\x47\x4d\x52\x6c\xe2\x81\x92\x0f\x05\x65\x55\xa1\xdc\xc0\xca\x07\xd4\xb8\xde\xc9\xf8\x37\x75\x3a\xed\xc7\xe3\xfa\xa5\xa3\x3d\xd2\xa7\x76\x95\x47\xf4\x28\x8f\x46\xbc\x63\xbd\xc8\xee\xe9\xb3\xe3\xfb\x8f\x1d\x7e\x0e\x98\xc7\x11\x3d\xc7\xd1\xb5\x0e\xb8\xcb\xae\x15\x93\xa3\x8c\x59\x51\xcc\xd4\xb5\x89\x1f\xce\x30\x79\xcc\xe2\xc4\xbe\xf7\xbe\x18\x38\x80\x9f\x19\x33\x37\xa5\xf5\xe6\xbb\x22\xdd\x2f\xd8\x59\x03\x5e\xfa\x61\xab\xaa\x68\xb2\xe4\x01\xb5\x6b\x59\x55\xeb\x9b\x75\xe9\x13\x86\xc1\x26\x9b\xb5\x06\x3e\x7f\xbd\xe9\x7c\x77\xb2\xad\xa6\x3d\xba\xc7\x74\xcd\xbf\x2f\x44\x1c\xa9\x44\x83\xbe\x39\x7d\x46\x7b\xfa\xa6\x5e\x5f\x72\xe0\xb6\xbd\x9f\xa2\xf3\xe5\xa7\xe6\xf1\x13\xde\x77\xaf\xb8\x5c\xff\x8a\x9f\x90\x89\xa1\x56\x55\x35\x9e\xdd\x8d\xbf\x34\xef\x54\x59\x86\x65\xc0\xfc\xe3\xfe\x87\xbd\xe3\x99\x97\xf4\x59\x6f\xfe\x33\xb3\x46\x4a\xb7\xfe\x1c\xfe\xf1\xcf\x67\x11\xea\xe6\xbf\xa6\xd5\xd0\x8f\xff\x17\x00\x00\xff\xff\x83\x48\xc2\x78\xc3\x5c\x00\x00"), }, "/control-plane/crds/kuma.io_proxytemplates.yaml": &vfsgen۰CompressedFileInfo{ name: "kuma.io_proxytemplates.yaml", @@ -82,11 +82,11 @@ var Templates = func() http.FileSystem { }, "/control-plane/kuma-cp": &vfsgen۰DirInfo{ name: "kuma-cp", - modTime: time.Date(2019, 11, 18, 13, 42, 10, 700391332, time.UTC), + modTime: time.Date(2019, 11, 26, 9, 52, 24, 228274284, time.UTC), }, "/control-plane/kuma-cp/app.yaml": &vfsgen۰CompressedFileInfo{ name: "app.yaml", - modTime: time.Date(2019, 11, 18, 13, 42, 10, 699780320, time.UTC), + modTime: time.Date(2019, 11, 26, 9, 52, 24, 228472155, time.UTC), uncompressedSize: 5616, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x58\x5b\x73\x9b\xba\x16\x7e\xf7\xaf\xd0\xf4\x3c\x63\xc7\x69\xda\xa6\xcc\xf4\xc1\xb5\x69\x8e\x27\xf1\x65\xc0\xc9\x39\x79\x72\x65\xbc\x8c\x35\x11\x48\x5b\x12\xec\x7a\xda\xfc\xf7\x3d\x02\x84\xc1\x06\x4c\xba\x9b\x27\xb3\x2e\x9f\xd6\xe5\x93\xb4\x14\xcb\xb2\x7a\x98\x93\x27\x10\x92\xb0\xc8\x46\xc9\xb0\xf7\x42\xa2\xad\x8d\x3c\x10\x09\xf1\xa1\x17\x82\xc2\x5b\xac\xb0\xdd\x43\x28\xc2\x21\xd8\xe8\xe7\x4f\xd4\x1f\xb3\x48\x09\x46\x97\x14\x47\x90\x5b\xce\x71\x08\xe8\xf5\x35\x37\x93\x1c\xfb\xb9\xed\xdc\x7c\x6a\xad\xe4\xe0\x6b\x28\xce\x84\x92\xfa\x87\x95\xfe\xb4\xd1\xcd\xcd\xfb\x1e\x42\x66\x8d\xbd\x52\x5c\x5a\x78\x1b\x12\xa9\xe3\xb2\x24\x88\x04\x44\x6a\xa0\xb0\x08\x40\x2d\x53\xa7\x0f\x99\x97\xc1\xf8\xf0\xf1\xd3\xa7\x12\x48\x20\xb8\x6f\xc9\xad\xac\x5a\xdc\x9e\x5a\xfc\x38\xb5\xf8\x7c\x12\xc8\x99\xc5\xed\xf0\xd4\x02\x73\x72\x8c\xb1\x64\x78\x7d\x6a\xb8\x61\x4c\x49\x25\x30\xaf\x35\x2f\x97\x20\x88\x4b\x90\x12\x28\xf8\x8a\x09\x3b\x35\xc0\x9c\xdb\xe8\x25\x0e\xb1\xe5\x67\x7d\xb0\xb8\x6e\x44\xef\x52\x33\x47\xbe\xcf\xe2\x48\xd5\xf4\xb4\x06\xac\xbd\x8f\x2d\x4b\xf9\x02\x54\x4f\x1d\x78\x0a\xbb\x01\x11\x81\x02\xd9\x27\x6c\xa0\xa8\x6c\x5a\x5a\x6e\xa5\xa5\xa8\xb4\x7c\x10\xea\xc2\xca\xc6\x5b\x51\xd9\xf7\x75\xdd\xb4\x85\xb7\x95\x2b\x2a\xc7\x20\x14\xfa\x85\x36\x1f\x6f\x20\xf2\x33\x2e\x6a\xab\x17\x38\x94\xad\xee\xe1\x50\x31\xfa\xc3\xa9\x9c\x92\xf6\x5f\xe5\x35\x32\x60\x5e\x8a\xd5\x21\xc7\x73\x8f\xce\xf9\x8e\x59\xb4\x23\xc1\x0c\xf3\x4e\x04\xd1\x5f\x3b\x12\x74\xcc\x2a\x33\xee\x1f\x70\x48\x6d\xf4\x2b\x65\xf1\x7f\x50\x2c\x01\xa9\x3d\x91\x68\x47\x28\x20\xc5\x10\x4b\x40\x08\xb2\x05\xb4\x85\x1d\x8e\xa9\xca\xdd\x62\x81\x15\x61\x11\x62\x3b\xf4\x3d\x0b\x84\x7f\xcf\x20\x72\x20\x09\x90\x9a\x0e\x72\x6d\x5f\x7f\xa0\x1d\x13\x08\x27\x98\x50\xbc\xa1\x80\x24\x28\x45\xa2\x40\x9e\xe5\x8f\x39\x97\x83\xa2\x08\x13\xe0\x94\x1d\x42\xf8\x33\xdb\x04\x21\x8a\x37\x40\x65\xfb\xbe\x35\x87\xa2\x3e\x18\x14\x04\x87\xcc\x5a\x30\x4a\x49\x14\x3c\xf2\x2d\x56\x90\x89\x10\x0a\xf1\x0f\x2f\x16\x01\xd8\x68\x78\x94\x3c\x46\x45\x9a\x36\xba\x3a\x3b\x2e\x42\xac\xfc\xfd\x43\x29\x8e\xe6\x48\x10\x52\x10\x72\x5a\x2c\x58\x2e\x81\xfe\xa3\x15\x94\x36\x1c\x84\x4c\x56\xe9\xef\xca\x01\x34\x6f\x2e\xa6\xfe\xd3\x32\x4c\x22\x10\xc5\x42\x56\x5e\xff\x3a\x6b\x84\x48\x88\x83\x9a\x7b\x69\xaa\xc5\xe8\xf5\xd5\x3e\x55\xe4\x9d\xcf\xfa\x53\x82\x58\xc6\x94\x2e\x19\x25\x7e\xbe\x95\xa6\x55\x61\xd9\x1e\xa2\xe4\x58\x04\x13\xdd\xfd\xe3\x6c\xb4\x76\xe6\x4f\x53\x77\x31\x9f\x39\xf3\x55\x61\x80\x50\x82\x69\x0c\x36\x7a\x77\x3c\x45\xde\xd5\xbb\x7b\xab\x85\xeb\xac\x57\xcf\x4b\xe7\xf7\xbd\xef\x1f\xbf\x3a\xee\xdc\x59\x39\xde\xda\x7b\xf6\x56\xce\x6c\x3d\x1f\xcd\x1c\x6f\x39\x1a\xd7\x80\xd6\x50\xb6\x06\xf8\xce\x99\x3b\xee\xe8\x61\x3d\x9a\x3c\x39\xee\x6a\xea\x39\x93\xf5\x7f\x17\xde\x4a\xe3\xd6\x43\x36\x0f\x08\xfd\x6e\x2b\x7a\x13\x6f\xed\x39\xee\x93\xe3\xae\xef\xdc\xe5\x78\xbd\x5c\xb8\x75\x05\xd5\x57\x7e\x43\x31\xfe\xdf\x19\xe1\xb6\x01\x61\xb4\x9c\x1a\x84\x46\xe7\xdb\x61\x83\xf3\xd7\xc5\x62\xe5\xad\xdc\xd1\xf2\x32\xc4\x75\x53\x3b\x8f\x19\xac\x1e\xbc\xf5\xd8\x71\x57\xeb\x6f\xd3\x87\x9a\x92\x0f\x12\x2c\x06\x22\x8e\x06\x32\xbd\xb3\x64\x7a\x10\xea\x8b\xca\xdc\xae\x03\x73\x0b\x0d\xf2\xfb\xa5\xd3\x8a\xf7\xce\xf3\x9f\x59\xf0\x05\x0e\xf5\x0b\x96\xb8\x3a\x9a\xcc\xa6\x9e\x37\x5d\xcc\x2f\x15\xec\xe6\xe6\x7d\x43\xc1\xda\xd0\xd2\xea\x4d\xa6\xee\x5b\x73\x39\xbd\xcf\x07\xa5\xfb\xbc\x9d\x33\xae\x33\x9a\xac\x17\xf3\x87\xe7\x9a\x24\x94\x88\xe1\x98\x04\x16\x81\x2c\x9f\x27\x22\x8e\x4a\x5f\x96\x45\x59\x60\x51\x48\x80\x7e\x21\xd1\x8e\x55\x54\xd9\x0d\x69\xe9\x1b\xf4\xcb\x00\x94\x5f\x0d\xbe\x72\x60\x0e\x4a\x97\x70\x81\x51\x0c\xe2\x06\xb2\x38\x7d\x2b\x23\x76\x93\xd6\x4c\xdc\x4d\xda\xdb\x56\xed\xe7\x36\xed\xed\xb0\x55\x7b\xdd\xaa\x3d\xc6\x4c\x49\x02\x11\x48\xb9\x14\x6c\x03\x76\xa9\x15\x7a\x1e\xbf\x03\x55\x16\x21\xc4\xb1\xda\xdb\x68\xb0\x07\x4c\xd5\xfe\x50\x55\x19\xec\xab\x42\x2c\x00\x6f\xc9\x9b\xc1\xb5\x57\x07\x68\xc9\x62\xe1\x83\x2c\x43\x08\xf8\x2b\x06\xa9\x64\x15\xd6\xe7\xb1\x8d\x86\x57\x57\x61\x45\x1a\x42\xc8\xc4\xc1\x46\xd7\x1f\x3e\xce\x48\xa1\x49\x18\x8d\x43\x98\xe9\x5b\x58\x9e\xdf\x60\x75\xb3\x78\x81\xa7\x7d\x96\x59\x06\x9d\x37\x7f\x25\x76\xbc\x5d\x44\xf4\x60\x23\xcd\xfd\xfa\xa5\xdb\x66\xe7\x37\xc7\x71\x79\xe3\x76\x0b\xaa\x61\xea\xad\x8b\xa7\x7d\xff\x5d\x5a\x37\xeb\xcd\xd9\xd0\xd3\xdc\x94\x2c\xed\x32\x19\x32\xc9\xbc\xd5\xef\x8d\x15\xef\xb0\xc8\x25\x90\xee\xe5\xf4\xcd\x13\xa4\xbc\xde\x25\xe7\xb3\x81\xde\x84\x23\x20\x20\xe9\x4c\x4d\x58\xd4\x7f\xb9\x4d\x5f\x6e\xc9\x70\x03\x0a\x9b\x69\x7f\x16\x2b\xac\x5f\x05\xff\x83\xcd\x9e\xb1\x97\x71\xf9\xb9\x71\xf9\x81\x17\xe6\xde\xd6\xdf\x99\xbb\x55\x79\xae\xf4\x72\xa9\xb4\x7b\xa6\x00\x21\xc8\x7d\x3f\x7f\xdb\x80\xe8\x57\xe1\xfa\x39\x73\x7a\x08\xed\x30\xa1\xb1\x00\x33\x8c\x7e\xc3\x44\x1f\xd8\x3e\x25\x10\xa9\x2c\xc6\xac\x3e\x3e\xfe\x1a\x47\x5b\x0a\x6f\x78\x2c\x16\xb3\xb8\xa9\x70\xfb\xf3\xe5\x58\xff\x8b\xff\xf6\x41\xc7\x13\x2e\x4f\xd1\x4a\x13\x24\xcc\x4a\x86\x98\xf2\x3d\x1e\x5a\xba\x00\x3d\x84\x44\x4c\x21\xff\xef\x0f\xe6\xe4\x4e\xb0\x98\xe7\xb4\xb7\xd0\xb1\x0a\xfa\x79\x61\xba\x5a\xa8\x0d\x54\xfa\xc9\x38\x64\xb5\x2e\xd4\x63\xd7\x19\xad\x9c\xfc\xe3\x71\x39\x31\x1f\x27\xc7\xa9\x95\xb6\x02\x6a\x1e\x83\xdd\xb9\xf3\x84\x29\xd9\xbe\x99\x3d\x49\xe1\x75\x91\x35\xc7\x8d\x93\x3b\xb1\x16\xca\x34\x91\xa6\x8e\x36\xbf\x49\x9c\x33\xea\x74\x21\xcf\x9b\xe8\x53\x10\x28\x4f\x18\xce\x18\x94\x35\xd3\xd0\x27\x6b\xe5\x09\x85\x8c\xb8\x5c\x9b\x5a\x32\x19\xc3\x0a\x76\x1d\xad\x8c\x61\x89\x5c\x46\x54\xa2\x58\x0d\xcd\x8c\x95\x12\x78\xb7\x23\x3e\x65\x81\xac\x93\x73\x10\x79\x03\x6a\xd5\x82\xc5\x0a\xaa\x1a\x4d\xac\xf4\x0c\xac\x8a\x73\x52\x97\x45\x5c\xb0\x1f\x07\xf3\xa8\x97\xbd\x7f\x02\x00\x00\xff\xff\xea\xf8\x88\xd2\xf0\x15\x00\x00"), @@ -100,11 +100,11 @@ var Templates = func() http.FileSystem { }, "/control-plane/kuma-injector": &vfsgen۰DirInfo{ name: "kuma-injector", - modTime: time.Date(2019, 10, 10, 16, 36, 17, 170801764, time.UTC), + modTime: time.Date(2019, 11, 26, 13, 5, 32, 294194731, time.UTC), }, "/control-plane/kuma-injector/app.yaml": &vfsgen۰CompressedFileInfo{ name: "app.yaml", - modTime: time.Date(2019, 10, 10, 16, 36, 17, 171104289, time.UTC), + modTime: time.Date(2019, 11, 26, 13, 5, 32, 294658021, time.UTC), uncompressedSize: 3933, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x4b\x73\xa3\x38\x10\xbe\xf3\x2b\x54\xb9\xe3\x47\x12\x67\x33\x54\xcd\xc1\x71\xbc\x19\x6f\x62\x9b\xc2\x64\xe6\xe8\x92\x45\x07\x6b\x23\x24\x56\x12\xec\xb8\x66\xf2\xdf\xb7\x84\x80\x40\xfc\x20\xd9\x19\x4e\xd0\xcf\xaf\xbb\x45\x77\xcb\x71\x5d\xd7\xc1\x29\xfd\x0a\x52\x51\xc1\x3d\x94\x0f\x9d\x67\xca\x23\x0f\xad\x40\xe6\x94\x80\x93\x80\xc6\x11\xd6\xd8\x73\x10\xe2\x38\x01\x0f\x3d\x67\x09\x76\x29\xff\x1b\x88\x16\xb2\xa4\xaa\x14\x13\xf0\xd0\x8f\x1f\xa8\xb7\xa8\x3e\xd1\xcb\x8b\xa3\x52\x20\x46\x33\x15\x52\x2b\xf3\xe2\x16\xaf\x1e\xba\xbc\xbc\x70\x10\xaa\x4c\x6e\xb5\x4e\x55\xf1\xad\xb1\x8c\x41\xfb\x85\xcc\xb5\x15\x52\xc0\x0a\x57\x5e\x21\x80\xd3\xf4\x2d\x84\x13\x31\x10\x09\xda\xd1\xbb\xb4\x80\xbd\x01\xc9\x41\x83\xea\x51\xd1\xd7\x4c\x75\x85\xe6\x6a\xa6\x5c\x02\x52\x77\xc4\x58\x99\xd0\x4c\xf5\x88\xc1\x6d\x24\x66\xa5\x91\x90\xa9\x09\x48\x8d\x7e\xa2\xcd\xd5\x25\x70\x62\x14\xac\xe8\x33\xec\xf6\x44\xef\x61\xd7\x92\x3c\x1a\xd9\x44\xf0\x27\x1a\xcf\x71\xda\x19\x04\x29\x24\xdf\x19\x82\x15\xee\xed\x70\xc2\x3c\xf4\xb3\xc8\x77\x65\xc8\x66\x1f\x21\x45\x23\x20\x58\x4e\x04\xd7\x98\x72\xa8\xe9\x08\x49\x88\xa8\x04\x52\x16\x6f\x38\x1a\x0c\x86\x35\x2f\xa3\x91\x87\x46\x57\x7f\x5c\xd7\x94\x78\x8f\x82\xa3\x84\x72\xab\xfc\xe9\x53\x43\x37\x92\x98\xf2\x90\x9a\xd0\x2e\x06\xca\x69\xf8\xc3\x11\xe5\xa0\x94\x2f\xc5\x06\x5e\x71\x18\xcc\x54\x53\xcc\x6e\x81\xe1\xdd\x0a\x88\xe0\x91\xf2\xd0\xb0\x21\xa0\x69\x02\x22\xd3\x35\xaf\x78\x2e\x1a\x02\x29\x48\x2a\xa2\x36\x1f\x8d\x1a\x02\x2a\x23\x04\x94\x0a\xb7\x12\xd4\x56\xb0\xa8\x90\x69\xba\x78\xc2\x94\x65\x12\xde\x08\x9c\xd7\x12\x8c\xe6\xf0\x7e\xf0\x57\x83\xdf\x8a\xbe\x0b\x9c\x04\x25\x32\x49\x40\x35\x81\x49\xf8\x27\x03\xa5\x5b\x34\x84\x48\x9a\x79\x68\x34\x48\x5a\xc4\x04\x12\x21\x77\x1e\xba\xba\x9c\xd3\x06\x83\xd1\x84\x1e\xd4\x1f\x0e\x06\x47\x2c\x8c\x86\xe7\x73\xba\xf7\x1f\xe0\x34\x55\xfd\xfa\x67\xb8\x85\x94\x89\x5d\x02\x5c\xff\x62\xb7\x42\x88\xe1\x0d\x30\x75\xb4\xd3\x54\xed\x4c\x69\x89\x35\xc4\x3b\x2b\x28\x05\x63\x94\xc7\x8f\x69\x84\x75\x5d\xca\x04\x7f\x5f\x65\x32\x86\xd7\x83\x97\xe0\xef\x8f\x1c\xe7\x98\x32\xbc\x61\xe0\xa1\xc1\x5e\x6f\x4b\xb0\x26\xdb\x87\x06\x84\x83\x20\x10\xd2\x90\xa4\xac\xf6\xd5\x8c\xb9\xc8\x72\xcb\xc0\x11\x13\x08\x55\xb1\x14\x45\xa8\xfe\xe6\x5a\xcd\x3d\x92\xbe\xf2\x8c\x26\x38\x86\x76\xf7\x9a\x19\x12\x7a\x79\xf1\x0c\xd1\x74\x07\x29\x98\xcf\x30\x87\xb2\x68\x36\xbf\x0d\x75\x3f\x63\xcc\x17\x8c\x92\xaa\x0d\xb6\x89\x4d\x79\xe0\xf9\x6b\x38\x15\xb2\xfb\xc7\xf9\x78\x3d\x5b\xfc\x35\x9d\x84\xcb\x60\xfd\x6d\x7a\xf3\x65\xb9\xbc\x5f\xaf\xa6\xc1\xd7\x69\xb0\xf6\x97\x41\xd8\x38\x4f\x39\x66\x19\x78\xe8\xcc\x4c\x94\xb3\x8f\x59\x9a\x4c\x83\x70\x7d\x3b\x0b\xf6\xad\xf5\x73\x2c\xfb\x32\xe3\x7d\x55\x8c\x19\xd5\x37\xb9\x32\xb3\xa5\x95\xb3\x7e\x63\x8a\x9c\x72\x3b\x59\x2e\xc2\x60\xf9\xb0\xf6\x1f\xc6\x8b\xe9\xfa\x66\xb9\x0c\x57\x61\x30\xf6\x2b\x18\x8f\xc1\xc3\x3e\x02\x33\x36\xbd\xbe\xf5\x47\x6c\xca\xdd\xd4\xe4\xbc\xf7\xf6\x68\x7b\xa3\xab\xeb\xf3\x0f\x21\x18\xfb\xb3\xdf\xe8\x7b\xd8\xe1\x7b\x35\xbb\x9d\x4e\xc6\x16\xc3\x78\xb6\x98\x06\xeb\xd9\x7c\x7c\x37\xdd\x77\x6b\x8c\xdf\x62\x8d\x0b\x57\x1f\x39\x73\x87\xfd\xce\x16\xb3\xf0\xa3\x4e\x39\xd5\x2d\xc7\x2d\xce\x01\xcf\x58\xc6\xaa\x79\x7c\x65\xc6\x1b\x5f\xae\xcb\x44\xec\x32\xc8\x81\x7d\xa6\xfc\x49\xb4\x58\x76\x1e\xbb\x4f\x94\xc1\xe7\x3e\x68\x72\xe4\x88\x35\xc6\x76\xad\x5e\x6f\x5c\x95\xb5\xfa\x1f\x6f\x2d\x57\xf6\x39\x3a\x8c\x4c\x95\xef\x40\xb7\x5b\x76\x8a\xf5\xd6\x43\xfd\x2d\x60\xa6\xb7\xbb\x36\x6b\xdf\xb6\x79\x14\xd9\x82\x49\xfe\x97\x30\xf4\x57\xef\x18\xe0\xa7\xdc\x1a\xad\x5f\x72\xfa\xb1\xd1\x36\x3c\x36\x99\x5a\xb3\x2d\x17\x2c\x4b\x60\x2e\x32\xde\x4e\x7a\xc7\x5a\x59\xdb\x34\x8a\xbe\x8d\xef\x7f\x76\x15\x9b\xce\x25\x67\x3b\x0f\x69\x99\x41\x07\x88\x7a\x2d\x3c\x04\xe1\xe8\x49\xeb\xf2\x66\xd3\x70\x7a\x88\xec\xc7\x6f\x23\x6d\xe6\xde\x52\x16\xdd\xca\xef\x0a\x8e\x54\xcb\x72\xd3\xc5\x09\xbd\xbd\x6d\x23\x4a\xa8\x32\xaf\x12\x62\x5a\x8c\x7e\x2a\x78\xef\xf9\xba\xb8\x48\xe4\xc3\x0d\x68\x5c\xad\x22\xf3\x4c\x63\x4d\x79\xfc\x0d\x36\x5b\x21\x9e\xed\x9a\x9e\x59\x8d\xce\x55\xfd\x5f\xab\x54\xc2\xa8\xb4\x4a\xaa\xf2\x9c\x83\xc1\xf6\xca\x42\x35\x57\x9b\x55\xd7\x56\x51\x15\xb7\x5c\xe6\x4b\x63\x45\xb0\xc0\xcd\x76\x12\x39\xf5\x92\xd8\x9a\xd1\xa5\xd3\x3f\x9b\x2c\xdb\xeb\x08\xa3\xc0\xb5\x0d\xd8\xba\x21\xf8\x26\xe3\x11\x83\xf7\x5c\x88\x4c\xc9\x8b\xfb\x66\x85\xf0\xf4\x9a\x76\xa4\x80\x25\xa7\x6c\x14\x96\xea\x96\x31\x3a\x08\xc9\x8c\x41\x79\x09\xc5\x29\xbd\x93\x22\x4b\xcb\x8c\xb8\xe8\xec\xac\xdc\xf9\xaa\xb2\xd7\x9c\xdc\xce\x2e\x91\x82\x2d\x48\xcd\x98\x04\xd3\x71\x68\xa7\xc5\x9b\xa6\x62\x2e\xb9\x91\x72\xfe\x0b\x00\x00\xff\xff\x71\xd8\x06\xb7\x5d\x0f\x00\x00"), diff --git a/pkg/api-server/dataplane_overview_ws.go b/pkg/api-server/dataplane_overview_ws.go index 53163e8c7e69..58b99714b387 100644 --- a/pkg/api-server/dataplane_overview_ws.go +++ b/pkg/api-server/dataplane_overview_ws.go @@ -51,12 +51,12 @@ func (r *overviewWs) inspectDataplane(request *restful.Request, response *restfu func (r *overviewWs) fetchOverview(ctx context.Context, name string, meshName string) (*mesh.DataplaneOverviewResource, error) { dataplane := mesh.DataplaneResource{} - if err := r.resManager.Get(ctx, &dataplane, store.GetByKey(namespace, name, meshName)); err != nil { + if err := r.resManager.Get(ctx, &dataplane, store.GetByKey(name, meshName)); err != nil { return nil, err } insight := mesh.DataplaneInsightResource{} - err := r.resManager.Get(ctx, &insight, store.GetByKey(namespace, name, meshName)) + err := r.resManager.Get(ctx, &insight, store.GetByKey(name, meshName)) if err != nil && !store.IsResourceNotFound(err) { // It's fine to have dataplane without insight return nil, err } diff --git a/pkg/api-server/dataplane_overview_ws_test.go b/pkg/api-server/dataplane_overview_ws_test.go index f75dc42a00d8..1336fb5b78ee 100644 --- a/pkg/api-server/dataplane_overview_ws_test.go +++ b/pkg/api-server/dataplane_overview_ws_test.go @@ -45,7 +45,7 @@ var _ = Describe("Dataplane Overview WS", func() { }) BeforeEach(func() { - err := resourceStore.Create(context.Background(), &mesh_core.MeshResource{}, store.CreateByKey("default", "mesh1", "mesh1")) + err := resourceStore.Create(context.Background(), &mesh_core.MeshResource{}, store.CreateByKey("mesh1", "mesh1")) Expect(err).ToNot(HaveOccurred()) }) @@ -66,7 +66,7 @@ var _ = Describe("Dataplane Overview WS", func() { }, }, } - err := resourceStore.Create(context.Background(), &dpResource, store.CreateByKey("default", "dp1", "mesh1")) + err := resourceStore.Create(context.Background(), &dpResource, store.CreateByKey("dp1", "mesh1")) Expect(err).ToNot(HaveOccurred()) sampleTime, _ := time.Parse(time.RFC3339, "2019-07-01T00:00:00+00:00") @@ -82,7 +82,7 @@ var _ = Describe("Dataplane Overview WS", func() { }, }, } - err = resourceStore.Create(context.Background(), &insightResource, store.CreateByKey("default", "dp1", "mesh1")) + err = resourceStore.Create(context.Background(), &insightResource, store.CreateByKey("dp1", "mesh1")) Expect(err).ToNot(HaveOccurred()) }) diff --git a/pkg/api-server/mesh_ws_test.go b/pkg/api-server/mesh_ws_test.go index 330dd5720472..d030ef153d12 100644 --- a/pkg/api-server/mesh_ws_test.go +++ b/pkg/api-server/mesh_ws_test.go @@ -21,8 +21,6 @@ var _ = Describe("Resource WS", func() { var client resourceApiClient var stop chan struct{} - const namespace = "default" - BeforeEach(func() { resourceStore = memory.NewStore() apiServer = createTestApiServer(resourceStore, config.DefaultApiServerConfig()) @@ -141,7 +139,7 @@ var _ = Describe("Resource WS", func() { // then resource := mesh.MeshResource{} - err := resourceStore.Get(context.Background(), &resource, store.GetByKey(namespace, name, name)) + err := resourceStore.Get(context.Background(), &resource, store.GetByKey(name, name)) Expect(err).ToNot(HaveOccurred()) Expect(resource.Spec.Tracing.Type).To(Equal(&v1alpha1.Tracing_Zipkin_{})) }) @@ -209,8 +207,8 @@ var _ = Describe("Resource WS", func() { // and resource := mesh.MeshResource{} - err := resourceStore.Get(context.Background(), &resource, store.GetByKey(namespace, name, name)) - Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), namespace, name, name))) + err := resourceStore.Get(context.Background(), &resource, store.GetByKey(name, name)) + Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), name, name))) }) It("should delete non-existing resource", func() { @@ -225,6 +223,6 @@ var _ = Describe("Resource WS", func() { func putMeshIntoStore(resourceStore store.ResourceStore, name string) { resource := mesh.MeshResource{} - err := resourceStore.Create(context.Background(), &resource, store.CreateByKey("default", name, name)) + err := resourceStore.Create(context.Background(), &resource, store.CreateByKey(name, name)) Expect(err).NotTo(HaveOccurred()) } diff --git a/pkg/api-server/resource_api_client_test.go b/pkg/api-server/resource_api_client_test.go index 0cfe607b4429..1eef7c6df353 100644 --- a/pkg/api-server/resource_api_client_test.go +++ b/pkg/api-server/resource_api_client_test.go @@ -94,7 +94,7 @@ func putSampleResourceIntoStore(resourceStore store.ResourceStore, name string, Path: "/sample-path", }, } - err := resourceStore.Create(context.Background(), &resource, store.CreateByKey("default", name, mesh)) + err := resourceStore.Create(context.Background(), &resource, store.CreateByKey(name, mesh)) Expect(err).NotTo(HaveOccurred()) } diff --git a/pkg/api-server/resource_ws.go b/pkg/api-server/resource_ws.go index 4f06ef1f7233..71b081cf82f7 100644 --- a/pkg/api-server/resource_ws.go +++ b/pkg/api-server/resource_ws.go @@ -14,8 +14,6 @@ import ( "github.com/emicklei/go-restful" ) -const namespace = "default" - type resourceWs struct { resManager manager.ResourceManager readOnly bool @@ -75,7 +73,7 @@ func (r *resourceWs) findResource(request *restful.Request, response *restful.Re meshName := r.meshFromRequest(request) resource := r.ResourceFactory() - err := r.resManager.Get(request.Request.Context(), resource, store.GetByKey(namespace, name, meshName)) + err := r.resManager.Get(request.Request.Context(), resource, store.GetByKey(name, meshName)) if err != nil { handleError(response, err, "Could not retrieve a resource") } else { @@ -119,7 +117,7 @@ func (r *resourceWs) createOrUpdateResource(request *restful.Request, response * } resource := r.ResourceFactory() - if err := r.resManager.Get(request.Request.Context(), resource, store.GetByKey(namespace, name, meshName)); err != nil { + if err := r.resManager.Get(request.Request.Context(), resource, store.GetByKey(name, meshName)); err != nil { if store.IsResourceNotFound(err) { r.createResource(request.Request.Context(), name, meshName, resourceRes.Spec, response) } else { @@ -150,7 +148,7 @@ func (r *resourceWs) validateResourceRequest(request *restful.Request, resource func (r *resourceWs) createResource(ctx context.Context, name string, meshName string, spec model.ResourceSpec, response *restful.Response) { res := r.ResourceFactory() _ = res.SetSpec(spec) - if err := r.resManager.Create(ctx, res, store.CreateByKey(namespace, name, meshName)); err != nil { + if err := r.resManager.Create(ctx, res, store.CreateByKey(name, meshName)); err != nil { handleError(response, err, "Could not create a resource") } else { response.WriteHeader(201) @@ -171,7 +169,7 @@ func (r *resourceWs) deleteResource(request *restful.Request, response *restful. meshName := r.meshFromRequest(request) resource := r.ResourceFactory() - if err := r.resManager.Delete(request.Request.Context(), resource, store.DeleteByKey(namespace, name, meshName)); err != nil { + if err := r.resManager.Delete(request.Request.Context(), resource, store.DeleteByKey(name, meshName)); err != nil { handleError(response, err, "Could not delete a resource") } } diff --git a/pkg/api-server/resource_ws_test.go b/pkg/api-server/resource_ws_test.go index 09348d52fab5..aa3ef3709b4a 100644 --- a/pkg/api-server/resource_ws_test.go +++ b/pkg/api-server/resource_ws_test.go @@ -25,7 +25,6 @@ var _ = Describe("Resource WS", func() { var client resourceApiClient var stop chan struct{} - const namespace = "default" const mesh = "default" BeforeEach(func() { @@ -50,7 +49,7 @@ var _ = Describe("Resource WS", func() { BeforeEach(func() { // create default mesh - err := resourceStore.Create(context.Background(), &mesh_res.MeshResource{}, store.CreateByKey(namespace, mesh, mesh)) + err := resourceStore.Create(context.Background(), &mesh_res.MeshResource{}, store.CreateByKey(mesh, mesh)) Expect(err).ToNot(HaveOccurred()) }) @@ -169,7 +168,7 @@ var _ = Describe("Resource WS", func() { // then resource := sample_model.TrafficRouteResource{} - err := resourceStore.Get(context.Background(), &resource, store.GetByKey(namespace, name, mesh)) + err := resourceStore.Get(context.Background(), &resource, store.GetByKey(name, mesh)) Expect(err).ToNot(HaveOccurred()) Expect(resource.Spec.Path).To(Equal("/update-sample-path")) }) @@ -357,7 +356,7 @@ var _ = Describe("Resource WS", func() { It("should return 400 when mesh does not exist", func() { // setup - err := resourceStore.Delete(context.Background(), &mesh_res.MeshResource{}, store.DeleteByKey("default", "default", "default")) + err := resourceStore.Delete(context.Background(), &mesh_res.MeshResource{}, store.DeleteByKey("default", "default")) Expect(err).ToNot(HaveOccurred()) // given @@ -409,8 +408,8 @@ var _ = Describe("Resource WS", func() { // and resource := sample_model.TrafficRouteResource{} - err := resourceStore.Get(context.Background(), &resource, store.GetByKey(namespace, name, mesh)) - Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), namespace, name, mesh))) + err := resourceStore.Get(context.Background(), &resource, store.GetByKey(name, mesh)) + Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), name, mesh))) }) It("should delete non-existing resource", func() { diff --git a/pkg/api-server/traffic_route_ws_test.go b/pkg/api-server/traffic_route_ws_test.go index f656480d9f84..e4a101ca103b 100644 --- a/pkg/api-server/traffic_route_ws_test.go +++ b/pkg/api-server/traffic_route_ws_test.go @@ -46,7 +46,7 @@ var _ = Describe("TrafficRoute WS", func() { BeforeEach(func() { // when - err := resourceStore.Create(context.Background(), &mesh_core.MeshResource{}, store.CreateByKey("default", "default", "default")) + err := resourceStore.Create(context.Background(), &mesh_core.MeshResource{}, store.CreateByKey("default", "default")) // then Expect(err).ToNot(HaveOccurred()) }) diff --git a/pkg/core/bootstrap/bootstrap.go b/pkg/core/bootstrap/bootstrap.go index 06add90beef6..152c4577f8a5 100644 --- a/pkg/core/bootstrap/bootstrap.go +++ b/pkg/core/bootstrap/bootstrap.go @@ -97,7 +97,7 @@ func createDefaultMesh(runtime core_runtime.Runtime) error { // default Mesh on Kubernetes is managed by a Controller return nil case config_core.UniversalEnvironment: - return mesh_managers.CreateDefaultMesh(runtime.ResourceManager(), runtime.Config().Defaults.MeshProto(), core_model.DefaultNamespace) + return mesh_managers.CreateDefaultMesh(runtime.ResourceManager(), runtime.Config().Defaults.MeshProto()) default: return errors.Errorf("unknown environment type %s", env) } diff --git a/pkg/core/bootstrap/bootstrap_test.go b/pkg/core/bootstrap/bootstrap_test.go index 8c401352c0c7..6c77e48ccac8 100644 --- a/pkg/core/bootstrap/bootstrap_test.go +++ b/pkg/core/bootstrap/bootstrap_test.go @@ -36,12 +36,12 @@ var _ = Describe("Bootstrap", func() { // then wait until resource is created resManager := rt.ResourceManager() Eventually(func() error { - getOpts := core_store.GetByKey(core_model.DefaultNamespace, core_model.DefaultMesh, core_model.DefaultMesh) + getOpts := core_store.GetByKey(core_model.DefaultMesh, core_model.DefaultMesh) return resManager.Get(context.Background(), &mesh.MeshResource{}, getOpts) }, "5s").Should(Succeed()) // when - getOpts := core_store.GetByKey(core_model.DefaultNamespace, core_model.DefaultMesh, core_model.DefaultMesh) + getOpts := core_store.GetByKey(core_model.DefaultMesh, core_model.DefaultMesh) defaultMesh := mesh.MeshResource{} err = resManager.Get(context.Background(), &defaultMesh, getOpts) Expect(err).ToNot(HaveOccurred()) @@ -50,7 +50,6 @@ var _ = Describe("Bootstrap", func() { meshMeta := defaultMesh.GetMeta() Expect(meshMeta.GetName()).To(Equal("default")) Expect(meshMeta.GetMesh()).To(Equal("default")) - Expect(meshMeta.GetNamespace()).To(Equal("default")) }) It("should skip creating mesh if one already exist", func() { @@ -62,15 +61,15 @@ var _ = Describe("Bootstrap", func() { template := runtime.Config().Defaults.MeshProto() // when - Expect(mesh_managers.CreateDefaultMesh(runtime.ResourceManager(), template, core_model.DefaultNamespace)).To(Succeed()) + Expect(mesh_managers.CreateDefaultMesh(runtime.ResourceManager(), template)).To(Succeed()) // then mesh exists - getOpts := core_store.GetByKey(core_model.DefaultNamespace, core_model.DefaultMesh, core_model.DefaultMesh) + getOpts := core_store.GetByKey(core_model.DefaultMesh, core_model.DefaultMesh) err = runtime.ResourceManager().Get(context.Background(), &mesh.MeshResource{}, getOpts) Expect(err).ToNot(HaveOccurred()) // when createDefaultMesh is called once mesh already exist - err = mesh_managers.CreateDefaultMesh(runtime.ResourceManager(), template, core_model.DefaultNamespace) + err = mesh_managers.CreateDefaultMesh(runtime.ResourceManager(), template) // then Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/core/ca/builtin/manager.go b/pkg/core/ca/builtin/manager.go index 860497c9c24f..53736e678e37 100644 --- a/pkg/core/ca/builtin/manager.go +++ b/pkg/core/ca/builtin/manager.go @@ -145,9 +145,8 @@ func (m *builtinCaManager) GetSecretName(mesh string) string { func builtinCaSecretKey(mesh string) core_model.ResourceKey { return core_model.ResourceKey{ - Mesh: mesh, - Namespace: core_model.DefaultNamespace, - Name: builtinCaSecretName(mesh), + Mesh: mesh, + Name: builtinCaSecretName(mesh), } } diff --git a/pkg/core/logs/matcher.go b/pkg/core/logs/matcher.go index 8be8457f9c94..4f29a53fb919 100644 --- a/pkg/core/logs/matcher.go +++ b/pkg/core/logs/matcher.go @@ -70,19 +70,15 @@ func (m *TrafficLogsMatcher) Match(ctx context.Context, dataplane *mesh_core.Dat } func (m *TrafficLogsMatcher) backendsByName(ctx context.Context, dataplane *mesh_core.DataplaneResource) (map[string]*mesh_proto.LoggingBackend, error) { - meshes := &mesh_core.MeshResourceList{} - // todo(jakubydszkiewicz) simplify to Get after we solve namespace problem - if err := m.ResourceManager.List(ctx, meshes, store.ListByMesh(dataplane.GetMeta().GetMesh())); err != nil { - return nil, errors.Wrap(err, "could not retrieve meshes") - } - if len(meshes.Items) != 1 { - return nil, errors.Errorf("found %d meshes. There should be only one mesh of name %s", len(meshes.Items), dataplane.GetMeta().GetMesh()) + mesh := mesh_core.MeshResource{} + if err := m.ResourceManager.Get(ctx, &mesh, store.GetByKey(dataplane.GetMeta().GetMesh(), dataplane.GetMeta().GetMesh())); err != nil { + return nil, err } backendsByName := map[string]*mesh_proto.LoggingBackend{} - for _, backend := range meshes.Items[0].Spec.GetLogging().GetBackends() { + for _, backend := range mesh.Spec.GetLogging().GetBackends() { backendsByName[backend.Name] = backend } - defaultBackend := meshes.Items[0].Spec.GetLogging().GetDefaultBackend() + defaultBackend := mesh.Spec.GetLogging().GetDefaultBackend() if defaultBackend != "" { backendsByName[""] = backendsByName[defaultBackend] } diff --git a/pkg/core/logs/matcher_test.go b/pkg/core/logs/matcher_test.go index 6fa5f27b6a0c..a8df9e9261e9 100644 --- a/pkg/core/logs/matcher_test.go +++ b/pkg/core/logs/matcher_test.go @@ -44,7 +44,7 @@ var _ = Describe("Matcher", func() { }, }, } - err := manager.Create(context.Background(), &meshRes, store.CreateByKey("default", "sample", "sample")) + err := manager.Create(context.Background(), &meshRes, store.CreateByKey("sample", "sample")) Expect(err).ToNot(HaveOccurred()) // and @@ -78,7 +78,7 @@ var _ = Describe("Matcher", func() { }, }, } - err = manager.Create(context.Background(), &dpRes, store.CreateByKey("default", "dp-1", "sample")) + err = manager.Create(context.Background(), &dpRes, store.CreateByKey("dp-1", "sample")) Expect(err).ToNot(HaveOccurred()) }) @@ -105,7 +105,7 @@ var _ = Describe("Matcher", func() { }, }, } - err := manager.Create(context.Background(), &logRes1, store.CreateByKey("default", "lr-1", "sample")) + err := manager.Create(context.Background(), &logRes1, store.CreateByKey("lr-1", "sample")) Expect(err).ToNot(HaveOccurred()) // and @@ -130,7 +130,7 @@ var _ = Describe("Matcher", func() { }, }, } - err = manager.Create(context.Background(), &logRes2, store.CreateByKey("default", "lr-2", "sample")) + err = manager.Create(context.Background(), &logRes2, store.CreateByKey("lr-2", "sample")) Expect(err).ToNot(HaveOccurred()) // and @@ -152,7 +152,7 @@ var _ = Describe("Matcher", func() { }, }, } - err = manager.Create(context.Background(), &logRes3, store.CreateByKey("default", "lr-3", "sample")) + err = manager.Create(context.Background(), &logRes3, store.CreateByKey("lr-3", "sample")) Expect(err).ToNot(HaveOccurred()) // when @@ -196,7 +196,7 @@ var _ = Describe("Matcher", func() { }, }, } - err := manager.Create(context.Background(), &logRes, store.CreateByKey("default", "lr-1", "sample")) + err := manager.Create(context.Background(), &logRes, store.CreateByKey("lr-1", "sample")) Expect(err).ToNot(HaveOccurred()) // when @@ -230,7 +230,7 @@ var _ = Describe("Matcher", func() { }, }, } - err := manager.Create(context.Background(), &logRes, store.CreateByKey("default", "lr-1", "sample")) + err := manager.Create(context.Background(), &logRes, store.CreateByKey("lr-1", "sample")) Expect(err).ToNot(HaveOccurred()) // when diff --git a/pkg/core/managers/apis/mesh/mesh_helpers.go b/pkg/core/managers/apis/mesh/mesh_helpers.go index 7f110679ec31..31b9f481ad7c 100644 --- a/pkg/core/managers/apis/mesh/mesh_helpers.go +++ b/pkg/core/managers/apis/mesh/mesh_helpers.go @@ -13,10 +13,10 @@ import ( "github.com/pkg/errors" ) -func CreateDefaultMesh(resManager core_manager.ResourceManager, template mesh_proto.Mesh, namespace string) error { +func CreateDefaultMesh(resManager core_manager.ResourceManager, template mesh_proto.Mesh) error { defaultMesh := mesh_core.MeshResource{} - key := core_model.ResourceKey{Namespace: namespace, Mesh: core_model.DefaultMesh, Name: core_model.DefaultMesh} + key := core_model.ResourceKey{Mesh: core_model.DefaultMesh, Name: core_model.DefaultMesh} if err := resManager.Get(context.Background(), &defaultMesh, core_store.GetBy(key)); err != nil { if core_store.IsResourceNotFound(err) { diff --git a/pkg/core/managers/apis/mesh/mesh_manager_test.go b/pkg/core/managers/apis/mesh/mesh_manager_test.go index 97c5339aae65..210b8eeca4d9 100644 --- a/pkg/core/managers/apis/mesh/mesh_manager_test.go +++ b/pkg/core/managers/apis/mesh/mesh_manager_test.go @@ -18,8 +18,6 @@ import ( var _ = Describe("Mesh Manager", func() { - const namespace = "default" - var resManager manager.ResourceManager var resStore store.ResourceStore var caManager builtin.BuiltinCaManager @@ -38,9 +36,8 @@ var _ = Describe("Mesh Manager", func() { // given meshName := "mesh-1" resKey := model.ResourceKey{ - Mesh: meshName, - Namespace: namespace, - Name: meshName, + Mesh: meshName, + Name: meshName, } // when @@ -64,16 +61,15 @@ var _ = Describe("Mesh Manager", func() { mesh := core_mesh.MeshResource{} resKey := model.ResourceKey{ - Mesh: meshName, - Namespace: namespace, - Name: meshName, + Mesh: meshName, + Name: meshName, } err := resManager.Create(context.Background(), &mesh, store.CreateBy(resKey)) Expect(err).ToNot(HaveOccurred()) // and resource associated with it dp := core_mesh.DataplaneResource{} - err = resStore.Create(context.Background(), &dp, store.CreateByKey(namespace, "dp-1", meshName)) + err = resStore.Create(context.Background(), &dp, store.CreateByKey("dp-1", meshName)) Expect(err).ToNot(HaveOccurred()) // when mesh is deleted @@ -83,29 +79,28 @@ var _ = Describe("Mesh Manager", func() { Expect(err).ToNot(HaveOccurred()) // and resource is deleted - err = resStore.Get(context.Background(), &core_mesh.DataplaneResource{}, store.GetByKey(namespace, "dp-1", meshName)) + err = resStore.Get(context.Background(), &core_mesh.DataplaneResource{}, store.GetByKey("dp-1", meshName)) Expect(store.IsResourceNotFound(err)).To(BeTrue()) // and built-in mesh CA is deleted _, err = caManager.GetRootCerts(context.Background(), meshName) Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(Equal("failed to load CA key pair for Mesh \"mesh-1\": Resource not found: type=\"Secret\" namespace=\"default\" name=\"builtinca.mesh-1\" mesh=\"mesh-1\"")) + Expect(err.Error()).To(Equal("failed to load CA key pair for Mesh \"mesh-1\": Resource not found: type=\"Secret\" name=\"builtinca.mesh-1\" mesh=\"mesh-1\"")) }) It("should delete all associated resources even if mesh is already removed", func() { // given resource that was not deleted with mesh dp := core_mesh.DataplaneResource{} dpKey := model.ResourceKey{ - Mesh: "already-deleted", - Namespace: namespace, - Name: "dp-1", + Mesh: "already-deleted", + Name: "dp-1", } err := resStore.Create(context.Background(), &dp, store.CreateBy(dpKey)) Expect(err).ToNot(HaveOccurred()) // when mesh := core_mesh.MeshResource{} - err = resManager.Delete(context.Background(), &mesh, store.DeleteByKey(namespace, "already-deleted", "already-deleted")) + err = resManager.Delete(context.Background(), &mesh, store.DeleteByKey("already-deleted", "already-deleted")) // then not found error is thrown Expect(err).To(HaveOccurred()) diff --git a/pkg/core/permissions/matcher_test.go b/pkg/core/permissions/matcher_test.go index b737e71f0609..cf0966d824d2 100644 --- a/pkg/core/permissions/matcher_test.go +++ b/pkg/core/permissions/matcher_test.go @@ -33,9 +33,8 @@ var _ = Describe("Matcher", func() { Items: []*core_mesh.TrafficPermissionResource{ { // not relevant resource Meta: &model.ResourceMeta{ - Name: "mobile-api-gateway", - Mesh: "default", - Namespace: "default", + Name: "mobile-api-gateway", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ Sources: []*mesh_proto.Selector{ @@ -56,9 +55,8 @@ var _ = Describe("Matcher", func() { }, { Meta: &model.ResourceMeta{ - Name: "mobile", - Mesh: "default", - Namespace: "default", + Name: "mobile", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ // relevant rule Sources: []*mesh_proto.Selector{ @@ -79,9 +77,8 @@ var _ = Describe("Matcher", func() { }, { Meta: &model.ResourceMeta{ - Name: "mobile-2", - Mesh: "default", - Namespace: "default", + Name: "mobile-2", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ // not relevant rule Sources: []*mesh_proto.Selector{ @@ -102,9 +99,8 @@ var _ = Describe("Matcher", func() { }, { Meta: &model.ResourceMeta{ - Name: "load-balancer", - Mesh: "default", - Namespace: "default", + Name: "load-balancer", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ // relevant rule Sources: []*mesh_proto.Selector{ @@ -125,9 +121,8 @@ var _ = Describe("Matcher", func() { }, { Meta: &model.ResourceMeta{ - Name: "load-balancer-2", - Mesh: "default", - Namespace: "default", + Name: "load-balancer-2", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ // not relevant rule Sources: []*mesh_proto.Selector{ @@ -158,9 +153,8 @@ var _ = Describe("Matcher", func() { Items: []*core_mesh.TrafficPermissionResource{ { Meta: &model.ResourceMeta{ - Name: "mobile", - Mesh: "default", - Namespace: "default", + Name: "mobile", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ Sources: []*mesh_proto.Selector{ @@ -188,9 +182,8 @@ var _ = Describe("Matcher", func() { Items: []*core_mesh.TrafficPermissionResource{ { Meta: &model.ResourceMeta{ - Name: "load-balancer", - Mesh: "default", - Namespace: "default", + Name: "load-balancer", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ Sources: []*mesh_proto.Selector{ diff --git a/pkg/core/resources/manager/manager_test.go b/pkg/core/resources/manager/manager_test.go index 7db204fabc9f..7ab8ea58b07d 100644 --- a/pkg/core/resources/manager/manager_test.go +++ b/pkg/core/resources/manager/manager_test.go @@ -28,7 +28,7 @@ var _ = Describe("Resource Manager", func() { meshRes := mesh.MeshResource{ Spec: mesh_proto.Mesh{}, } - return resManager.Create(context.Background(), &meshRes, store.CreateByKey("default", name, name)) + return resManager.Create(context.Background(), &meshRes, store.CreateByKey(name, name)) } createSampleResource := func(mesh string) (*sample.TrafficRouteResource, error) { @@ -37,7 +37,7 @@ var _ = Describe("Resource Manager", func() { Path: "/some", }, } - err := resManager.Create(context.Background(), &trRes, store.CreateByKey("default", "tr-1", mesh)) + err := resManager.Create(context.Background(), &trRes, store.CreateByKey("tr-1", mesh)) return &trRes, err } @@ -76,9 +76,8 @@ var _ = Describe("Resource Manager", func() { Expect(err).ToNot(HaveOccurred()) tlKey := model.ResourceKey{ - Mesh: "mesh-1", - Namespace: "default", - Name: "tl-1", + Mesh: "mesh-1", + Name: "tl-1", } trafficLog := &mesh.TrafficLogResource{ Spec: mesh_proto.TrafficLog{ @@ -109,7 +108,7 @@ var _ = Describe("Resource Manager", func() { // and resource from mesh-1 is deleted res1 := sample.TrafficRouteResource{} - err = resManager.Get(context.Background(), &res1, store.GetByKey("default", "tr-1", "mesh-1")) + err = resManager.Get(context.Background(), &res1, store.GetByKey("tr-1", "mesh-1")) Expect(store.IsResourceNotFound(err)).To(BeTrue()) // and only TrafficRoutes are deleted @@ -117,7 +116,7 @@ var _ = Describe("Resource Manager", func() { // and resource from mesh-2 is retained res2 := sample.TrafficRouteResource{} - err = resManager.Get(context.Background(), &res2, store.GetByKey("default", "tr-1", "mesh-2")) + err = resManager.Get(context.Background(), &res2, store.GetByKey("tr-1", "mesh-2")) Expect(err).ToNot(HaveOccurred()) }) diff --git a/pkg/core/resources/model/resource.go b/pkg/core/resources/model/resource.go index 89b502a29fbd..9e1f9ce7d761 100644 --- a/pkg/core/resources/model/resource.go +++ b/pkg/core/resources/model/resource.go @@ -8,14 +8,12 @@ import ( ) const ( - DefaultMesh = "default" - DefaultNamespace = "default" + DefaultMesh = "default" ) type ResourceKey struct { - Mesh string - Namespace string - Name string + Mesh string + Name string } type Resource interface { @@ -31,7 +29,6 @@ type ResourceType string type ResourceMeta interface { GetName() string - GetNamespace() string GetVersion() string GetMesh() string } @@ -41,9 +38,8 @@ func MetaToResourceKey(meta ResourceMeta) ResourceKey { return ResourceKey{} } return ResourceKey{ - Mesh: meta.GetMesh(), - Namespace: meta.GetNamespace(), - Name: meta.GetName(), + Mesh: meta.GetMesh(), + Name: meta.GetName(), } } diff --git a/pkg/core/resources/store/options.go b/pkg/core/resources/store/options.go index 46c5fd2ae646..dad045414c67 100644 --- a/pkg/core/resources/store/options.go +++ b/pkg/core/resources/store/options.go @@ -5,9 +5,8 @@ import ( ) type CreateOptions struct { - Namespace string - Name string - Mesh string + Name string + Mesh string } type CreateOptionsFunc func(*CreateOptions) @@ -21,12 +20,11 @@ func NewCreateOptions(fs ...CreateOptionsFunc) *CreateOptions { } func CreateBy(key model.ResourceKey) CreateOptionsFunc { - return CreateByKey(key.Namespace, key.Name, key.Mesh) + return CreateByKey(key.Name, key.Mesh) } -func CreateByKey(ns, name, mesh string) CreateOptionsFunc { +func CreateByKey(name, mesh string) CreateOptionsFunc { return func(opts *CreateOptions) { - opts.Namespace = ns opts.Name = name opts.Mesh = mesh } @@ -46,9 +44,8 @@ func NewUpdateOptions(fs ...UpdateOptionsFunc) *UpdateOptions { } type DeleteOptions struct { - Namespace string - Name string - Mesh string + Name string + Mesh string } type DeleteOptionsFunc func(*DeleteOptions) @@ -62,12 +59,11 @@ func NewDeleteOptions(fs ...DeleteOptionsFunc) *DeleteOptions { } func DeleteBy(key model.ResourceKey) DeleteOptionsFunc { - return DeleteByKey(key.Namespace, key.Name, key.Mesh) + return DeleteByKey(key.Name, key.Mesh) } -func DeleteByKey(ns, name, mesh string) DeleteOptionsFunc { +func DeleteByKey(name, mesh string) DeleteOptionsFunc { return func(opts *DeleteOptions) { - opts.Namespace = ns opts.Name = name opts.Mesh = mesh } @@ -94,9 +90,8 @@ func NewDeleteAllOptions(fs ...DeleteAllOptionsFunc) *DeleteAllOptions { } type GetOptions struct { - Namespace string - Name string - Mesh string + Name string + Mesh string } type GetOptionsFunc func(*GetOptions) @@ -110,20 +105,18 @@ func NewGetOptions(fs ...GetOptionsFunc) *GetOptions { } func GetBy(key model.ResourceKey) GetOptionsFunc { - return GetByKey(key.Namespace, key.Name, key.Mesh) + return GetByKey(key.Name, key.Mesh) } -func GetByKey(ns, name, mesh string) GetOptionsFunc { +func GetByKey(name, mesh string) GetOptionsFunc { return func(opts *GetOptions) { - opts.Namespace = ns opts.Name = name opts.Mesh = mesh } } type ListOptions struct { - Namespace string - Mesh string + Mesh string } type ListOptionsFunc func(*ListOptions) @@ -136,12 +129,6 @@ func NewListOptions(fs ...ListOptionsFunc) *ListOptions { return opts } -func ListByNamespace(ns string) ListOptionsFunc { - return func(opts *ListOptions) { - opts.Namespace = ns - } -} - func ListByMesh(mesh string) ListOptionsFunc { return func(opts *ListOptions) { opts.Mesh = mesh diff --git a/pkg/core/resources/store/store.go b/pkg/core/resources/store/store.go index 4830f91420b8..3f92de09f71d 100644 --- a/pkg/core/resources/store/store.go +++ b/pkg/core/resources/store/store.go @@ -44,9 +44,6 @@ func (s *strictResourceStore) Create(ctx context.Context, r model.Resource, fs . if opts.Name == "" { return fmt.Errorf("ResourceStore.Create() requires options.Name to be a non-empty value") } - if opts.Namespace == "" { - return fmt.Errorf("ResourceStore.Create() requires options.Namespace to be a non-empty value") - } if opts.Mesh == "" { return fmt.Errorf("ResourceStore.Create() requires options.Mesh to be a non-empty value") } @@ -69,9 +66,6 @@ func (s *strictResourceStore) Delete(ctx context.Context, r model.Resource, fs . if opts.Name == "" { return fmt.Errorf("ResourceStore.Delete() requires options.Name to be a non-empty value") } - if opts.Namespace == "" { - return fmt.Errorf("ResourceStore.Delete() requires options.Namespace to be a non-empty value") - } if opts.Mesh == "" { return fmt.Errorf("ResourceStore.Delete() requires options.Mesh to be a non-empty value") } @@ -79,9 +73,6 @@ func (s *strictResourceStore) Delete(ctx context.Context, r model.Resource, fs . if opts.Name != r.GetMeta().GetName() { return fmt.Errorf("ResourceStore.Delete() requires resource.GetMeta() either to be a nil or resource.GetMeta().GetName() == options.Name") } - if opts.Namespace != r.GetMeta().GetNamespace() { - return fmt.Errorf("ResourceStore.Delete() requires resource.GetMeta() either to be a nil or resource.GetMeta().GetNamespace() == options.Namespace") - } if opts.Mesh != r.GetMeta().GetMesh() { return fmt.Errorf("ResourceStore.Delete() requires resource.GetMeta() either to be a nil or resource.GetMeta().GetMesh() == options.Mesh") } @@ -99,9 +90,6 @@ func (s *strictResourceStore) Get(ctx context.Context, r model.Resource, fs ...G if opts.Name == "" { return fmt.Errorf("ResourceStore.Get() requires options.Name to be a non-empty value") } - if opts.Namespace == "" { - return fmt.Errorf("ResourceStore.Get() requires options.Namespace to be a non-empty value") - } if opts.Mesh == "" { return fmt.Errorf("ResourceStore.Get() requires options.Mesh to be a non-empty value") } @@ -122,16 +110,16 @@ func (s *strictResourceStore) Close() error { return nil } -func ErrorResourceNotFound(rt model.ResourceType, namespace, name, mesh string) error { - return fmt.Errorf("Resource not found: type=%q namespace=%q name=%q mesh=%q", rt, namespace, name, mesh) +func ErrorResourceNotFound(rt model.ResourceType, name, mesh string) error { + return fmt.Errorf("Resource not found: type=%q name=%q mesh=%q", rt, name, mesh) } -func ErrorResourceAlreadyExists(rt model.ResourceType, namespace, name, mesh string) error { - return fmt.Errorf("Resource already exists: type=%q namespace=%q name=%q mesh=%q", rt, namespace, name, mesh) +func ErrorResourceAlreadyExists(rt model.ResourceType, name, mesh string) error { + return fmt.Errorf("Resource already exists: type=%q name=%q mesh=%q", rt, name, mesh) } -func ErrorResourceConflict(rt model.ResourceType, namespace, name, mesh string) error { - return fmt.Errorf("Resource conflict: type=%q namespace=%q name=%q mesh=%q", rt, namespace, name, mesh) +func ErrorResourceConflict(rt model.ResourceType, name, mesh string) error { + return fmt.Errorf("Resource conflict: type=%q name=%q mesh=%q", rt, name, mesh) } func IsResourceNotFound(err error) bool { diff --git a/pkg/core/xds/types.go b/pkg/core/xds/types.go index a32499f42e4c..fe7eec410a65 100644 --- a/pkg/core/xds/types.go +++ b/pkg/core/xds/types.go @@ -16,13 +16,12 @@ import ( ) type ProxyId struct { - Mesh string - Namespace string - Name string + Mesh string + Name string } func (id *ProxyId) String() string { - return fmt.Sprintf("%s.%s.%s", id.Mesh, id.Name, id.Namespace) + return fmt.Sprintf("%s.%s", id.Mesh, id.Name) } // ServiceName is a convenience type alias to clarify the meaning of string value. @@ -93,7 +92,7 @@ func ParseProxyId(node *envoy_core.Node) (*ProxyId, error) { } func ParseProxyIdFromString(id string) (*ProxyId, error) { - parts := strings.Split(id, ".") + parts := strings.SplitN(id, ".", 2) mesh := parts[0] if mesh == "" { return nil, errors.New("mesh must not be empty") @@ -105,32 +104,22 @@ func ParseProxyIdFromString(id string) (*ProxyId, error) { if name == "" { return nil, errors.New("name must not be empty") } - ns := core_model.DefaultNamespace - if len(parts) == 3 { - ns = parts[2] - } - if ns == "" { - return nil, errors.New("namespace must not be empty") - } return &ProxyId{ - Mesh: mesh, - Namespace: ns, - Name: name, + Mesh: mesh, + Name: name, }, nil } func (id *ProxyId) ToResourceKey() core_model.ResourceKey { return core_model.ResourceKey{ - Name: id.Name, - Namespace: id.Namespace, - Mesh: id.Mesh, + Name: id.Name, + Mesh: id.Mesh, } } func FromResourceKey(key core_model.ResourceKey) ProxyId { return ProxyId{ - Mesh: key.Mesh, - Namespace: key.Namespace, - Name: key.Name, + Mesh: key.Mesh, + Name: key.Name, } } diff --git a/pkg/core/xds/types_test.go b/pkg/core/xds/types_test.go index 284c10efcde8..c6500d74c2d7 100644 --- a/pkg/core/xds/types_test.go +++ b/pkg/core/xds/types_test.go @@ -35,7 +35,7 @@ var _ = Describe("xDS", func() { Id: "pilot.example", }, expected: core_xds.ProxyId{ - Mesh: "pilot", Namespace: "default", Name: "example", + Mesh: "pilot", Name: "example", }, }), Entry("name with namespace and mesh", testCase{ @@ -43,7 +43,7 @@ var _ = Describe("xDS", func() { Id: "pilot.example.demo", }, expected: core_xds.ProxyId{ - Mesh: "pilot", Namespace: "demo", Name: "example", + Mesh: "pilot", Name: "example.demo", }, }), ) @@ -85,12 +85,6 @@ var _ = Describe("xDS", func() { }, expectedErr: "name must not be empty", }), - Entry("mesh with empty namespace", testCase{ - node: &envoy_core.Node{ - Id: "pilot.default.", - }, - expectedErr: "namespace must not be empty", - }), ) }) }) @@ -99,16 +93,14 @@ var _ = Describe("xDS", func() { It("should convert proxy ID to resource key", func() { // given id := core_xds.ProxyId{ - Mesh: "default", - Namespace: "pilot", - Name: "demo", + Mesh: "default", + Name: "demo", } // when key := id.ToResourceKey() // then - Expect(key.Namespace).To(Equal("pilot")) Expect(key.Mesh).To(Equal("default")) Expect(key.Name).To(Equal("demo")) }) diff --git a/pkg/plugins/discovery/k8s/controllers/dataplane_controller.go b/pkg/plugins/discovery/k8s/controllers/dataplane_controller.go index 379477538ede..4e685c4639a9 100644 --- a/pkg/plugins/discovery/k8s/controllers/dataplane_controller.go +++ b/pkg/plugins/discovery/k8s/controllers/dataplane_controller.go @@ -17,6 +17,7 @@ import ( core_model "github.com/Kong/kuma/pkg/core/resources/model" k8s_resources "github.com/Kong/kuma/pkg/plugins/resources/k8s" mesh_k8s "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/api/v1alpha1" + util_k8s "github.com/Kong/kuma/pkg/util/k8s" ) // DataplaneReconciler reconciles a Dataplane object @@ -36,8 +37,7 @@ func (r *DataplaneReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { if err := r.Get(ctx, req.NamespacedName, crd); err != nil { if apierrs.IsNotFound(err) { return ctrl.Result{}, r.DiscoverySink.OnDataplaneDelete(core_model.ResourceKey{ - Namespace: req.NamespacedName.Namespace, - Name: req.NamespacedName.Name, + Name: util_k8s.K8sNamespacedNameToCoreName(req.Name, req.Namespace), }) } log.Error(err, "unable to fetch Dataplane") diff --git a/pkg/plugins/discovery/universal/store_polling_source_test.go b/pkg/plugins/discovery/universal/store_polling_source_test.go index cf37c9e4af85..9e1bd2deb011 100644 --- a/pkg/plugins/discovery/universal/store_polling_source_test.go +++ b/pkg/plugins/discovery/universal/store_polling_source_test.go @@ -82,7 +82,7 @@ var _ = Describe("Store Polling Source", func() { }, }, } - err := memoryStore.Create(context.Background(), resource, store.CreateByKey("sample-ns", "sample-mesh", "sample-name")) + err := memoryStore.Create(context.Background(), resource, store.CreateByKey("sample-mesh", "sample-name")) Expect(err).ToNot(HaveOccurred()) }) @@ -104,7 +104,7 @@ var _ = Describe("Store Polling Source", func() { Expect(consumer.Updates()).To(HaveLen(1)) // when - err = memoryStore.Delete(context.Background(), resource, store.DeleteByKey("sample-ns", "sample-mesh", "sample-name")) + err = memoryStore.Delete(context.Background(), resource, store.DeleteByKey("sample-mesh", "sample-name")) Expect(err).ToNot(HaveOccurred()) err = source.detectChanges() diff --git a/pkg/plugins/resources/k8s/k8s_suite_test.go b/pkg/plugins/resources/k8s/k8s_suite_test.go index e89f75e373c3..ba97fbaace39 100644 --- a/pkg/plugins/resources/k8s/k8s_suite_test.go +++ b/pkg/plugins/resources/k8s/k8s_suite_test.go @@ -17,6 +17,7 @@ limitations under the License. package k8s_test import ( + mesh_k8s "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/api/v1alpha1" "github.com/Kong/kuma/pkg/test/apis/sample/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "path/filepath" @@ -54,7 +55,10 @@ var _ = BeforeSuite(func(done Done) { By("bootstrapping test environment") testEnv = &envtest.Environment{ - CRDDirectoryPaths: []string{filepath.Join("native", "test", "config", "crd", "bases")}, + CRDDirectoryPaths: []string{ + filepath.Join("native", "test", "config", "crd", "bases"), + filepath.Join("native", "config", "crd", "bases"), + }, } cfg, err := testEnv.Start() @@ -64,6 +68,9 @@ var _ = BeforeSuite(func(done Done) { err = sample_v1alpha1.AddToScheme(k8sClientScheme) Expect(err).NotTo(HaveOccurred()) + err = mesh_k8s.AddToScheme(k8sClientScheme) + Expect(err).NotTo(HaveOccurred()) + // +kubebuilder:scaffold:scheme k8sClient, err = client.New(cfg, client.Options{Scheme: k8sClientScheme}) diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_insight_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_insight_types_helpers.go index 0d9aedaea0b6..f2863d5d0008 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_insight_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_insight_types_helpers.go @@ -31,6 +31,10 @@ func (pt *DataplaneInsight) SetSpec(spec map[string]interface{}) { pt.Status = spec } +func (pt *DataplaneInsight) Scope() model.Scope { + return model.ScopeNamespace +} + func (l *DataplaneInsightList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_types_helpers.go index 6678d34ac9a7..0f1ef760be62 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/dataplane_types_helpers.go @@ -39,6 +39,10 @@ func (l *DataplaneList) GetItems() []model.KubernetesObject { return result } +func (l *Dataplane) Scope() model.Scope { + return model.ScopeNamespace +} + func init() { registry.RegisterObjectType(&proto.Dataplane{}, &Dataplane{ TypeMeta: metav1.TypeMeta{ diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_helpers.go index 95d722e4565f..62f7258aa452 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_helpers.go @@ -31,6 +31,10 @@ func (pt *Mesh) SetSpec(spec map[string]interface{}) { pt.Spec = spec } +func (pt *Mesh) Scope() model.Scope { + return model.ScopeCluster +} + func (l *MeshList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_test.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_test.go index 2fae104c4b32..bda950fd838f 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_test.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/mesh_types_test.go @@ -48,13 +48,11 @@ var _ = Describe("Mesh", func() { It("should create an object successfully", func() { key = types.NamespacedName{ - Name: "foo", - Namespace: "default", + Name: "foo", } created = &Mesh{ ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Namespace: "default", + Name: "foo", }} By("creating an API obj") diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/proxytemplate_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/proxytemplate_types_helpers.go index 7f2a0a7bbbd0..e29f7dd9adf0 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/proxytemplate_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/proxytemplate_types_helpers.go @@ -31,6 +31,10 @@ func (pt *ProxyTemplate) SetSpec(spec map[string]interface{}) { pt.Spec = spec } +func (l *ProxyTemplate) Scope() model.Scope { + return model.ScopeNamespace +} + func (l *ProxyTemplateList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficlogging_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficlogging_types_helpers.go index 00a82bffc95e..d512e2b4e10d 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficlogging_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficlogging_types_helpers.go @@ -31,6 +31,10 @@ func (tp *TrafficLog) SetSpec(spec map[string]interface{}) { tp.Spec = spec } +func (tp *TrafficLog) Scope() model.Scope { + return model.ScopeNamespace +} + func (l *TrafficLogList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficpermission_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficpermission_types_helpers.go index 5f33b508c6a9..fb215ffe8c52 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficpermission_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficpermission_types_helpers.go @@ -31,6 +31,10 @@ func (tp *TrafficPermission) SetSpec(spec map[string]interface{}) { tp.Spec = spec } +func (tp *TrafficPermission) Scope() model.Scope { + return model.ScopeNamespace +} + func (l *TrafficPermissionList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficroute_types_helpers.go b/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficroute_types_helpers.go index 3cd6e737f848..ff1662d0d2fa 100644 --- a/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficroute_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/api/v1alpha1/trafficroute_types_helpers.go @@ -31,6 +31,10 @@ func (pt *TrafficRoute) SetSpec(spec map[string]interface{}) { pt.Spec = spec } +func (pt *TrafficRoute) Scope() model.Scope { + return model.ScopeNamespace +} + func (l *TrafficRouteList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/native/config/crd/bases/kuma.io_meshes.yaml b/pkg/plugins/resources/k8s/native/config/crd/bases/kuma.io_meshes.yaml index 94603764445f..bdd94b4a2c44 100644 --- a/pkg/plugins/resources/k8s/native/config/crd/bases/kuma.io_meshes.yaml +++ b/pkg/plugins/resources/k8s/native/config/crd/bases/kuma.io_meshes.yaml @@ -10,7 +10,7 @@ spec: names: kind: Mesh plural: meshes - scope: "" + scope: Cluster validation: openAPIV3Schema: description: Mesh is the Schema for the meshes API diff --git a/pkg/plugins/resources/k8s/native/pkg/model/resources.go b/pkg/plugins/resources/k8s/native/pkg/model/resources.go index 0a928ff60c33..7a64a26654e1 100644 --- a/pkg/plugins/resources/k8s/native/pkg/model/resources.go +++ b/pkg/plugins/resources/k8s/native/pkg/model/resources.go @@ -5,6 +5,13 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +type Scope string + +const ( + ScopeNamespace Scope = "namespace" + ScopeCluster Scope = "cluster" +) + type KubernetesObject interface { runtime.Object GetObjectMeta() *metav1.ObjectMeta @@ -13,6 +20,7 @@ type KubernetesObject interface { SetMesh(string) GetSpec() map[string]interface{} SetSpec(map[string]interface{}) + Scope() Scope } type KubernetesList interface { diff --git a/pkg/plugins/resources/k8s/native/test/api/sample/v1alpha1/sample_types_helpers.go b/pkg/plugins/resources/k8s/native/test/api/sample/v1alpha1/sample_types_helpers.go index 5af2fefed964..35572ee11359 100644 --- a/pkg/plugins/resources/k8s/native/test/api/sample/v1alpha1/sample_types_helpers.go +++ b/pkg/plugins/resources/k8s/native/test/api/sample/v1alpha1/sample_types_helpers.go @@ -29,6 +29,10 @@ func (pt *SampleTrafficRoute) SetSpec(spec map[string]interface{}) { pt.Spec = spec } +func (pt *SampleTrafficRoute) Scope() model.Scope { + return model.ScopeNamespace +} + func (l *SampleTrafficRouteList) GetItems() []model.KubernetesObject { result := make([]model.KubernetesObject, len(l.Items)) for i := range l.Items { diff --git a/pkg/plugins/resources/k8s/store.go b/pkg/plugins/resources/k8s/store.go index 524a5dc429e5..ab33317103e7 100644 --- a/pkg/plugins/resources/k8s/store.go +++ b/pkg/plugins/resources/k8s/store.go @@ -3,11 +3,11 @@ package k8s import ( "context" "fmt" - core_model "github.com/Kong/kuma/pkg/core/resources/model" "github.com/Kong/kuma/pkg/core/resources/store" k8s_model "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/pkg/model" k8s_registry "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/pkg/registry" + util_k8s "github.com/Kong/kuma/pkg/util/k8s" util_proto "github.com/Kong/kuma/pkg/util/proto" "github.com/pkg/errors" kube_apierrs "k8s.io/apimachinery/pkg/api/errors" @@ -35,12 +35,16 @@ func (s *KubernetesStore) Create(ctx context.Context, r core_model.Resource, fs if err != nil { return errors.Wrap(err, "failed to convert core model into k8s counterpart") } - obj.GetObjectMeta().SetNamespace(opts.Namespace) - obj.GetObjectMeta().SetName(opts.Name) + name, namespace, err := k8sNameNamespace(opts.Name, obj.Scope()) + if err != nil { + return err + } obj.SetMesh(opts.Mesh) + obj.GetObjectMeta().SetName(name) + obj.GetObjectMeta().SetNamespace(namespace) if err := s.Client.Create(ctx, obj); err != nil { if kube_apierrs.IsAlreadyExists(err) { - return store.ErrorResourceAlreadyExists(r.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceAlreadyExists(r.GetType(), opts.Name, opts.Mesh) } return errors.Wrap(err, "failed to create k8s resource") } @@ -50,6 +54,7 @@ func (s *KubernetesStore) Create(ctx context.Context, r core_model.Resource, fs } return nil } + func (s *KubernetesStore) Update(ctx context.Context, r core_model.Resource, fs ...store.UpdateOptionsFunc) error { obj, err := s.Converter.ToKubernetesObject(r) if err != nil { @@ -57,7 +62,7 @@ func (s *KubernetesStore) Update(ctx context.Context, r core_model.Resource, fs } if err := s.Client.Update(ctx, obj); err != nil { if kube_apierrs.IsConflict(err) { - return store.ErrorResourceConflict(r.GetType(), r.GetMeta().GetNamespace(), r.GetMeta().GetName(), r.GetMeta().GetMesh()) + return store.ErrorResourceConflict(r.GetType(), r.GetMeta().GetName(), r.GetMeta().GetMesh()) } return errors.Wrap(err, "failed to update k8s resource") } @@ -71,7 +76,7 @@ func (s *KubernetesStore) Delete(ctx context.Context, r core_model.Resource, fs opts := store.NewDeleteOptions(fs...) // get object and validate mesh - if err := s.Get(ctx, r, store.GetByKey(opts.Namespace, opts.Name, opts.Mesh)); err != nil { + if err := s.Get(ctx, r, store.GetByKey(opts.Name, opts.Mesh)); err != nil { return err } @@ -79,8 +84,12 @@ func (s *KubernetesStore) Delete(ctx context.Context, r core_model.Resource, fs if err != nil { return errors.Wrapf(err, "failed to convert core model of type %s into k8s counterpart", r.GetType()) } - obj.GetObjectMeta().SetNamespace(opts.Namespace) - obj.GetObjectMeta().SetName(opts.Name) + name, namespace, err := k8sNameNamespace(opts.Name, obj.Scope()) + if err != nil { + return err + } + obj.GetObjectMeta().SetName(name) + obj.GetObjectMeta().SetNamespace(namespace) if err := s.Client.Delete(ctx, obj); err != nil { if kube_apierrs.IsNotFound(err) { return nil @@ -95,9 +104,13 @@ func (s *KubernetesStore) Get(ctx context.Context, r core_model.Resource, fs ... if err != nil { return errors.Wrapf(err, "failed to convert core model of type %s into k8s counterpart", r.GetType()) } - if err := s.Client.Get(ctx, kube_client.ObjectKey{Namespace: opts.Namespace, Name: opts.Name}, obj); err != nil { + name, namespace, err := k8sNameNamespace(opts.Name, obj.Scope()) + if err != nil { + return err + } + if err := s.Client.Get(ctx, kube_client.ObjectKey{Namespace: namespace, Name: name}, obj); err != nil { if kube_apierrs.IsNotFound(err) { - return store.ErrorResourceNotFound(r.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(r.GetType(), opts.Name, opts.Mesh) } return errors.Wrap(err, "failed to get k8s resource") } @@ -105,7 +118,7 @@ func (s *KubernetesStore) Get(ctx context.Context, r core_model.Resource, fs ... return errors.Wrap(err, "failed to convert k8s model into core counterpart") } if r.GetMeta().GetMesh() != opts.Mesh { - return store.ErrorResourceNotFound(r.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(r.GetType(), opts.Name, opts.Mesh) } return nil } @@ -115,7 +128,7 @@ func (s *KubernetesStore) List(ctx context.Context, rs core_model.ResourceList, if err != nil { return errors.Wrapf(err, "failed to convert core list model of type %s into k8s counterpart", rs.GetItemType()) } - if err := s.Client.List(ctx, obj, kube_client.InNamespace(opts.Namespace)); err != nil { + if err := s.Client.List(ctx, obj); err != nil { return errors.Wrap(err, "failed to list k8s resources") } predicate := func(r core_model.Resource) bool { @@ -130,6 +143,17 @@ func (s *KubernetesStore) List(ctx context.Context, rs core_model.ResourceList, return nil } +func k8sNameNamespace(coreName string, scope k8s_model.Scope) (string, string, error) { + switch scope { + case k8s_model.ScopeCluster: + return coreName, "", nil + case k8s_model.ScopeNamespace: + return util_k8s.CoreNameToK8sName(coreName) + default: + return "", "", errors.Errorf("unknown scope %s", scope) + } +} + var _ core_model.ResourceMeta = &KubernetesMetaAdapter{} type KubernetesMetaAdapter struct { @@ -137,6 +161,13 @@ type KubernetesMetaAdapter struct { Mesh string } +func (m *KubernetesMetaAdapter) GetName() string { + if m.Namespace == "" { // it's cluster scoped object + return m.ObjectMeta.Name + } + return util_k8s.K8sNamespacedNameToCoreName(m.ObjectMeta.Name, m.ObjectMeta.Namespace) +} + func (m *KubernetesMetaAdapter) GetVersion() string { return m.ObjectMeta.GetResourceVersion() } @@ -198,8 +229,8 @@ func (c *SimpleConverter) ToKubernetesObject(r core_model.Resource) (k8s_model.K obj.SetSpec(spec) if r.GetMeta() != nil { if adapter, ok := r.GetMeta().(*KubernetesMetaAdapter); ok { - obj.SetObjectMeta(&adapter.ObjectMeta) obj.SetMesh(adapter.Mesh) + obj.SetObjectMeta(&adapter.ObjectMeta) } else { return nil, fmt.Errorf("meta has unexpected type: %#v", r.GetMeta()) } diff --git a/pkg/plugins/resources/k8s/store_test.go b/pkg/plugins/resources/k8s/store_test.go index e9cfb56444b1..cf5185e4cf81 100644 --- a/pkg/plugins/resources/k8s/store_test.go +++ b/pkg/plugins/resources/k8s/store_test.go @@ -3,16 +3,19 @@ package k8s_test import ( "context" "fmt" - . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + mesh_proto "github.com/Kong/kuma/api/mesh/v1alpha1" + core_mesh "github.com/Kong/kuma/pkg/core/resources/apis/mesh" "github.com/Kong/kuma/pkg/core/resources/store" "github.com/Kong/kuma/pkg/plugins/resources/k8s" + mesh_k8s "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/api/v1alpha1" k8s_registry "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/pkg/registry" sample_k8s "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/test/api/sample/v1alpha1" sample_proto "github.com/Kong/kuma/pkg/test/apis/sample/v1alpha1" sample_core "github.com/Kong/kuma/pkg/test/resources/apis/sample" + util_k8s "github.com/Kong/kuma/pkg/util/k8s" apierrs "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -25,6 +28,7 @@ var _ = Describe("KubernetesStore", func() { var ks *k8s.KubernetesStore var s store.ResourceStore var ns string // each test should run in a dedicated k8s namespace + var coreName string const name = "demo" const mesh = "default" @@ -73,7 +77,9 @@ var _ = Describe("KubernetesStore", func() { BeforeEach(func() { kubeTypes := k8s_registry.NewTypeRegistry() Expect(kubeTypes.RegisterObjectType(&sample_proto.TrafficRoute{}, &sample_k8s.SampleTrafficRoute{})).To(Succeed()) + Expect(kubeTypes.RegisterObjectType(&mesh_proto.Mesh{}, &mesh_k8s.Mesh{})).To(Succeed()) Expect(kubeTypes.RegisterListType(&sample_proto.TrafficRoute{}, &sample_k8s.SampleTrafficRouteList{})).To(Succeed()) + Expect(kubeTypes.RegisterListType(&mesh_proto.Mesh{}, &mesh_k8s.MeshList{})).To(Succeed()) ks = &k8s.KubernetesStore{ Client: k8sClient, @@ -85,6 +91,14 @@ var _ = Describe("KubernetesStore", func() { } s = store.NewStrictResourceStore(ks) ns = string(uuid.NewUUID()) + coreName = util_k8s.K8sNamespacedNameToCoreName(name, ns) + }) + + AfterEach(func() { + err := k8sClient.DeleteAllOf(context.Background(), &sample_k8s.SampleTrafficRoute{}, client.InNamespace(ns)) + Expect(err).ToNot(HaveOccurred()) + err = k8sClient.DeleteAllOf(context.Background(), &mesh_k8s.Mesh{}, client.InNamespace(ns)) + Expect(err).ToNot(HaveOccurred()) }) Describe("Create()", func() { @@ -104,13 +118,12 @@ var _ = Describe("KubernetesStore", func() { `).(*sample_k8s.SampleTrafficRoute) // when - err := s.Create(context.Background(), tr, store.CreateByKey(ns, name, mesh)) + err := s.Create(context.Background(), tr, store.CreateByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) // and - Expect(tr.Meta.GetNamespace()).To(Equal(ns)) - Expect(tr.Meta.GetName()).To(Equal(name)) + Expect(tr.Meta.GetName()).To(Equal(coreName)) Expect(tr.Meta.GetMesh()).To(Equal(mesh)) Expect(tr.Meta.GetVersion()).ToNot(Equal("")) @@ -124,21 +137,64 @@ var _ = Describe("KubernetesStore", func() { Expect(actual.ObjectMeta.ResourceVersion).To(Equal(tr.Meta.GetVersion())) }) + It("should create a new Mesh", func() { + // given + mesh := core_mesh.MeshResource{ + Spec: mesh_proto.Mesh{ + Mtls: &mesh_proto.Mesh_Mtls{ + Enabled: true, + Ca: &mesh_proto.CertificateAuthority{ + Type: &mesh_proto.CertificateAuthority_Builtin_{ + Builtin: &mesh_proto.CertificateAuthority_Builtin{}, + }, + }, + }, + }, + } + + expected := backend.ParseYAML(fmt.Sprintf(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: %s + spec: + mtls: + enabled: true + ca: + builtin: {} +`, name)).(*mesh_k8s.Mesh) + + // when + err := s.Create(context.Background(), &mesh, store.CreateByKey(name, name)) + + // then + Expect(err).ToNot(HaveOccurred()) + + // when + actual := mesh_k8s.Mesh{} + backend.Get(&actual, ns, name) + + // then + Expect(actual.Spec).To(Equal(expected.Spec)) + // and + Expect(actual.ObjectMeta.ResourceVersion).To(Equal(mesh.Meta.GetVersion())) + }) + It("should not create a duplicate resource", func() { // setup backend.AssertNotExists(&sample_k8s.SampleTrafficRoute{}, ns, name) // when - err := s.Create(context.Background(), &sample_core.TrafficRouteResource{}, store.CreateByKey(ns, name, mesh)) + err := s.Create(context.Background(), &sample_core.TrafficRouteResource{}, store.CreateByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) // when - err = s.Create(context.Background(), &sample_core.TrafficRouteResource{}, store.CreateByKey(ns, name, mesh)) + err = s.Create(context.Background(), &sample_core.TrafficRouteResource{}, store.CreateByKey(coreName, mesh)) // then - Expect(err).To(MatchError(store.ErrorResourceAlreadyExists(sample_core.TrafficRouteType, ns, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceAlreadyExists(sample_core.TrafficRouteType, coreName, mesh))) }) }) @@ -169,7 +225,7 @@ var _ = Describe("KubernetesStore", func() { tr := &sample_core.TrafficRouteResource{} // when - err := s.Get(context.Background(), tr, store.GetByKey(ns, name, mesh)) + err := s.Get(context.Background(), tr, store.GetByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) version := tr.Meta.GetVersion() @@ -194,6 +250,63 @@ var _ = Describe("KubernetesStore", func() { Expect(actual.ObjectMeta.ResourceVersion).To(Equal(tr.Meta.GetVersion())) }) + It("should create a new Mesh", func() { + // setup + initial := backend.ParseYAML(fmt.Sprintf(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: %s + spec: + mtls: + enabled: false + ca: + builtin: {} +`, name)) + backend.Create(initial) + + // and + expected := backend.ParseYAML(fmt.Sprintf(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: %s + spec: + mtls: + enabled: true + ca: + builtin: {} +`, name)).(*mesh_k8s.Mesh) + + // given + mesh := &core_mesh.MeshResource{} + + // when + err := s.Get(context.Background(), mesh, store.GetByKey(name, name)) + + // then + Expect(err).ToNot(HaveOccurred()) + version := mesh.Meta.GetVersion() + + // when + mesh.Spec.Mtls.Enabled = true + err = s.Update(context.Background(), mesh) + // then + Expect(err).ToNot(HaveOccurred()) + // and + Expect(mesh.Meta.GetVersion()).ToNot(Equal("")) + Expect(mesh.Meta.GetVersion()).ToNot(Equal(version)) + + // when + actual := mesh_k8s.Mesh{} + backend.Get(&actual, ns, name) + + // then + Expect(actual.Spec).To(Equal(expected.Spec)) + // and + Expect(actual.ObjectMeta.ResourceVersion).To(Equal(mesh.Meta.GetVersion())) + }) + It("should return an error if resource is not found", func() { // setup initial := backend.ParseYAML(fmt.Sprintf(` @@ -210,7 +323,7 @@ var _ = Describe("KubernetesStore", func() { tr := &sample_core.TrafficRouteResource{} // when - err := s.Get(context.Background(), tr, store.GetByKey(ns, name, mesh)) + err := s.Get(context.Background(), tr, store.GetByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -220,7 +333,7 @@ var _ = Describe("KubernetesStore", func() { err = s.Update(context.Background(), tr) // then - Expect(err).To(MatchError(store.ErrorResourceConflict(sample_core.TrafficRouteType, ns, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceConflict(sample_core.TrafficRouteType, coreName, mesh))) }) It("should return an error if resource has changed", func() { @@ -239,7 +352,7 @@ var _ = Describe("KubernetesStore", func() { tr1 := &sample_core.TrafficRouteResource{} // when - err := s.Get(context.Background(), tr1, store.GetByKey(ns, name, mesh)) + err := s.Get(context.Background(), tr1, store.GetByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -247,7 +360,7 @@ var _ = Describe("KubernetesStore", func() { tr2 := &sample_core.TrafficRouteResource{} // when - err = s.Get(context.Background(), tr2, store.GetByKey(ns, name, mesh)) + err = s.Get(context.Background(), tr2, store.GetByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -261,7 +374,7 @@ var _ = Describe("KubernetesStore", func() { tr2.Spec.Path = "/another" err = s.Update(context.Background(), tr2) // then - Expect(err).To(MatchError(store.ErrorResourceConflict(sample_core.TrafficRouteType, ns, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceConflict(sample_core.TrafficRouteType, coreName, mesh))) }) }) @@ -271,10 +384,10 @@ var _ = Describe("KubernetesStore", func() { backend.AssertNotExists(&sample_k8s.SampleTrafficRoute{}, ns, name) // when - err := s.Get(context.Background(), &sample_core.TrafficRouteResource{}, store.GetByKey(ns, name, mesh)) + err := s.Get(context.Background(), &sample_core.TrafficRouteResource{}, store.GetByKey(coreName, mesh)) // then - Expect(err).To(MatchError(store.ErrorResourceNotFound(sample_core.TrafficRouteType, ns, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceNotFound(sample_core.TrafficRouteType, coreName, mesh))) }) It("should return an existing resource", func() { @@ -295,16 +408,53 @@ var _ = Describe("KubernetesStore", func() { actual := &sample_core.TrafficRouteResource{} // when - err := s.Get(context.Background(), actual, store.GetByKey(ns, name, mesh)) + err := s.Get(context.Background(), actual, store.GetByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) // and - Expect(actual.Meta.GetNamespace()).To(Equal(ns)) - Expect(actual.Meta.GetName()).To(Equal(name)) + Expect(actual.Meta.GetName()).To(Equal(coreName)) // and Expect(actual.Spec.Path).To(Equal("/example")) }) + + It("should return Mesh", func() { + // setup + expected := backend.ParseYAML(fmt.Sprintf(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: %s + spec: + mtls: + enabled: false + ca: + builtin: {} +`, name)) + backend.Create(expected) + + // given + actual := &core_mesh.MeshResource{} + + // when + err := s.Get(context.Background(), actual, store.GetByKey(name, name)) + + // then + Expect(err).ToNot(HaveOccurred()) + // and + Expect(actual.Meta.GetName()).To(Equal(name)) + // and + Expect(actual.Spec).To(Equal(mesh_proto.Mesh{ + Mtls: &mesh_proto.Mesh_Mtls{ + Enabled: false, + Ca: &mesh_proto.CertificateAuthority{ + Type: &mesh_proto.CertificateAuthority_Builtin_{ + Builtin: &mesh_proto.CertificateAuthority_Builtin{}, + }, + }, + }, + })) + }) }) Describe("Delete()", func() { @@ -314,11 +464,11 @@ var _ = Describe("KubernetesStore", func() { resource := sample_core.TrafficRouteResource{} // when - err := s.Delete(context.Background(), &resource, store.DeleteByKey(ns, name, mesh)) + err := s.Delete(context.Background(), &resource, store.DeleteByKey(coreName, mesh)) // then Expect(err).To(HaveOccurred()) - Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), ns, name, mesh))) + Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), coreName, mesh))) }) It("should delete an existing resource", func() { @@ -334,13 +484,32 @@ var _ = Describe("KubernetesStore", func() { backend.Create(initial) // when - err := s.Delete(context.Background(), &sample_core.TrafficRouteResource{}, store.DeleteByKey(ns, name, mesh)) + err := s.Delete(context.Background(), &sample_core.TrafficRouteResource{}, store.DeleteByKey(coreName, mesh)) // then Expect(err).ToNot(HaveOccurred()) // and backend.AssertNotExists(&sample_k8s.SampleTrafficRoute{}, ns, name) }) + + It("should delete Mesh", func() { + // setup + initial := backend.ParseYAML(fmt.Sprintf(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: %s +`, name)) + backend.Create(initial) + + // when + err := s.Delete(context.Background(), &core_mesh.MeshResource{}, store.DeleteByKey(name, name)) + + // then + Expect(err).ToNot(HaveOccurred()) + // and + backend.AssertNotExists(&mesh_k8s.Mesh{}, ns, "pilot") + }) }) Describe("List()", func() { @@ -349,7 +518,7 @@ var _ = Describe("KubernetesStore", func() { trl := &sample_core.TrafficRouteResourceList{} // when - err := s.List(context.Background(), trl, store.ListByNamespace(ns), store.ListByMesh(mesh)) + err := s.List(context.Background(), trl, store.ListByMesh(mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -387,7 +556,7 @@ var _ = Describe("KubernetesStore", func() { trl := &sample_core.TrafficRouteResourceList{} // when - err := s.List(context.Background(), trl, store.ListByNamespace(ns), store.ListByMesh(mesh)) + err := s.List(context.Background(), trl, store.ListByMesh(mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -400,11 +569,39 @@ var _ = Describe("KubernetesStore", func() { trl.Items[1].Meta.GetName(): trl.Items[1], } // then - Expect(items["one"].Meta.GetNamespace()).To(Equal(ns)) - Expect(items["one"].Spec.Path).To(Equal("/example")) + Expect(items[fmt.Sprintf("one.%s", ns)].Spec.Path).To(Equal("/example")) + // and + Expect(items[fmt.Sprintf("two.%s", ns)].Spec.Path).To(Equal("/another")) + }) + + It("should return a list of matching Meshes", func() { + // setup + one := backend.ParseYAML(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: demo-1 +`) + backend.Create(one) // and - Expect(items["two"].Meta.GetNamespace()).To(Equal(ns)) - Expect(items["two"].Spec.Path).To(Equal("/another")) + two := backend.ParseYAML(` + apiVersion: kuma.io/v1alpha1 + kind: Mesh + metadata: + name: demo-2 +`) + backend.Create(two) + + // given + meshes := &core_mesh.MeshResourceList{} + + // when + err := s.List(context.Background(), meshes) + + // then + Expect(err).ToNot(HaveOccurred()) + Expect(meshes.Items).To(HaveLen(2)) + Expect([]string{meshes.Items[0].Meta.GetName(), meshes.Items[1].Meta.GetName()}).To(ConsistOf("demo-1", "demo-2")) }) }) }) diff --git a/pkg/plugins/resources/memory/store.go b/pkg/plugins/resources/memory/store.go index ccd5652b4c6a..93419a6ec734 100644 --- a/pkg/plugins/resources/memory/store.go +++ b/pkg/plugins/resources/memory/store.go @@ -13,7 +13,6 @@ import ( type memoryStoreRecord struct { ResourceType string - Namespace string Name string Mesh string Version memoryVersion @@ -24,18 +23,14 @@ type memoryStoreRecords = []*memoryStoreRecord var _ model.ResourceMeta = &memoryMeta{} type memoryMeta struct { - Namespace string - Name string - Mesh string - Version memoryVersion + Name string + Mesh string + Version memoryVersion } func (m memoryMeta) GetName() string { return m.Name } -func (m memoryMeta) GetNamespace() string { - return m.Namespace -} func (m memoryMeta) GetMesh() string { return m.Mesh } @@ -74,16 +69,15 @@ func (c *memoryStore) Create(_ context.Context, r model.Resource, fs ...store.Cr opts := store.NewCreateOptions(fs...) - // Namespace and Name must be provided via CreateOptions - if _, record := c.findRecord(string(r.GetType()), opts.Namespace, opts.Name, opts.Mesh); record != nil { - return store.ErrorResourceAlreadyExists(r.GetType(), opts.Namespace, opts.Name, opts.Mesh) + // Name must be provided via CreateOptions + if _, record := c.findRecord(string(r.GetType()), opts.Name, opts.Mesh); record != nil { + return store.ErrorResourceAlreadyExists(r.GetType(), opts.Name, opts.Mesh) } meta := memoryMeta{ - Name: opts.Name, - Namespace: opts.Namespace, - Mesh: opts.Mesh, - Version: initialVersion(), + Name: opts.Name, + Mesh: opts.Mesh, + Version: initialVersion(), } // fill the meta @@ -113,11 +107,11 @@ func (c *memoryStore) Update(_ context.Context, r model.Resource, fs ...store.Up return fmt.Errorf("MemoryStore.Update() requires r.GetMeta() to be of type memoryMeta") } - // Namespace and Name must be provided via r.GetMeta() + // Name must be provided via r.GetMeta() mesh := r.GetMeta().GetMesh() - idx, record := c.findRecord(string(r.GetType()), r.GetMeta().GetNamespace(), r.GetMeta().GetName(), mesh) + idx, record := c.findRecord(string(r.GetType()), r.GetMeta().GetName(), mesh) if record == nil || meta.Version != record.Version { - return store.ErrorResourceConflict(r.GetType(), r.GetMeta().GetNamespace(), r.GetMeta().GetName(), r.GetMeta().GetMesh()) + return store.ErrorResourceConflict(r.GetType(), r.GetMeta().GetName(), r.GetMeta().GetMesh()) } meta.Version = meta.Version.Next() @@ -144,10 +138,10 @@ func (c *memoryStore) Delete(_ context.Context, r model.Resource, fs ...store.De return fmt.Errorf("MemoryStore.Delete() requires r.GetMeta() either to be nil or to be of type memoryMeta") } - // Namespace and Name must be provided via DeleteOptions - idx, record := c.findRecord(string(r.GetType()), opts.Namespace, opts.Name, opts.Mesh) + // Name must be provided via DeleteOptions + idx, record := c.findRecord(string(r.GetType()), opts.Name, opts.Mesh) if record == nil { - return store.ErrorResourceNotFound(r.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(r.GetType(), opts.Name, opts.Mesh) } c.records = append(c.records[:idx], c.records[idx+1:]...) return nil @@ -159,10 +153,10 @@ func (c *memoryStore) Get(_ context.Context, r model.Resource, fs ...store.GetOp opts := store.NewGetOptions(fs...) - // Namespace and Name must be provided via GetOptions - _, record := c.findRecord(string(r.GetType()), opts.Namespace, opts.Name, opts.Mesh) + // Name must be provided via GetOptions + _, record := c.findRecord(string(r.GetType()), opts.Name, opts.Mesh) if record == nil { - return store.ErrorResourceNotFound(r.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(r.GetType(), opts.Name, opts.Mesh) } return c.unmarshalRecord(record, r) } @@ -172,8 +166,7 @@ func (c *memoryStore) List(_ context.Context, rs model.ResourceList, fs ...store opts := store.NewListOptions(fs...) - // Namespace must be provided via ListOptions - records := c.findRecords(string(rs.GetItemType()), opts.Namespace, opts.Mesh) + records := c.findRecords(string(rs.GetItemType()), opts.Mesh) for _, record := range records { r := rs.NewItem() if err := c.unmarshalRecord(record, r); err != nil { @@ -185,10 +178,9 @@ func (c *memoryStore) List(_ context.Context, rs model.ResourceList, fs ...store } func (c *memoryStore) findRecord( - resourceType string, namespace string, name string, mesh string) (int, *memoryStoreRecord) { + resourceType string, name string, mesh string) (int, *memoryStoreRecord) { for idx, rec := range c.records { if rec.ResourceType == resourceType && - rec.Namespace == namespace && rec.Name == name && rec.Mesh == mesh { return idx, rec @@ -198,11 +190,10 @@ func (c *memoryStore) findRecord( } func (c *memoryStore) findRecords( - resourceType string, namespace string, mesh string) []*memoryStoreRecord { + resourceType string, mesh string) []*memoryStoreRecord { res := make([]*memoryStoreRecord, 0) for _, rec := range c.records { if rec.ResourceType == resourceType && - (namespace == "" || rec.Namespace == namespace) && (mesh == "" || rec.Mesh == mesh) { res = append(res, rec) } @@ -218,21 +209,19 @@ func (c *memoryStore) marshalRecord(resourceType string, meta memoryMeta, spec m } return &memoryStoreRecord{ ResourceType: resourceType, - // Namespace and Name must be provided via CreateOptions - Namespace: meta.Namespace, - Name: meta.Name, - Mesh: meta.Mesh, - Version: meta.Version, - Spec: string(content), + // Name must be provided via CreateOptions + Name: meta.Name, + Mesh: meta.Mesh, + Version: meta.Version, + Spec: string(content), }, nil } func (c *memoryStore) unmarshalRecord(s *memoryStoreRecord, r model.Resource) error { r.SetMeta(memoryMeta{ - Namespace: s.Namespace, - Name: s.Name, - Mesh: s.Mesh, - Version: s.Version, + Name: s.Name, + Mesh: s.Mesh, + Version: s.Version, }) return util_proto.FromJSON([]byte(s.Spec), r.GetSpec()) } diff --git a/pkg/plugins/resources/postgres/store.go b/pkg/plugins/resources/postgres/store.go index 510a0cffc4cf..ec920b057425 100644 --- a/pkg/plugins/resources/postgres/store.go +++ b/pkg/plugins/resources/postgres/store.go @@ -59,19 +59,18 @@ func (r *postgresResourceStore) Create(_ context.Context, resource model.Resourc version := 0 statement := `INSERT INTO resources VALUES ($1, $2, $3, $4, $5, $6);` - _, err = r.db.Exec(statement, opts.Name, opts.Namespace, opts.Mesh, resource.GetType(), version, string(bytes)) + _, err = r.db.Exec(statement, opts.Name, "", opts.Mesh, resource.GetType(), version, string(bytes)) // todo(jakubdyszkiewicz) solve db migration if err != nil { if strings.Contains(err.Error(), duplicateKeyErrorMsg) { - return store.ErrorResourceAlreadyExists(resource.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceAlreadyExists(resource.GetType(), opts.Name, opts.Mesh) } return errors.Wrapf(err, "failed to execute query: %s", statement) } resource.SetMeta(&resourceMetaObject{ - Name: opts.Name, - Namespace: opts.Namespace, - Mesh: opts.Mesh, - Version: strconv.Itoa(version), + Name: opts.Name, + Mesh: opts.Mesh, + Version: strconv.Itoa(version), }) return nil } @@ -86,13 +85,12 @@ func (r *postgresResourceStore) Update(_ context.Context, resource model.Resourc if err != nil { return errors.Wrap(err, "failed to convert meta version to int") } - statement := `UPDATE resources SET spec=$1, version=$2 WHERE name=$3 AND namespace=$4 AND mesh=$5 AND type=$6 AND version=$7;` + statement := `UPDATE resources SET spec=$1, version=$2 WHERE name=$3 AND mesh=$4 AND type=$5 AND version=$6;` result, err := r.db.Exec( statement, string(bytes), version+1, resource.GetMeta().GetName(), - resource.GetMeta().GetNamespace(), resource.GetMeta().GetMesh(), resource.GetType(), version, @@ -101,15 +99,14 @@ func (r *postgresResourceStore) Update(_ context.Context, resource model.Resourc return errors.Wrapf(err, "failed to execute query %s", statement) } if rows, _ := result.RowsAffected(); rows != 1 { // error ignored, postgres supports RowsAffected() - return store.ErrorResourceConflict(resource.GetType(), resource.GetMeta().GetNamespace(), resource.GetMeta().GetName(), resource.GetMeta().GetMesh()) + return store.ErrorResourceConflict(resource.GetType(), resource.GetMeta().GetName(), resource.GetMeta().GetMesh()) } // update resource's meta with new version resource.SetMeta(&resourceMetaObject{ - Name: resource.GetMeta().GetName(), - Namespace: resource.GetMeta().GetNamespace(), - Mesh: resource.GetMeta().GetMesh(), - Version: strconv.Itoa(version), + Name: resource.GetMeta().GetName(), + Mesh: resource.GetMeta().GetMesh(), + Version: strconv.Itoa(version), }) return nil @@ -118,13 +115,13 @@ func (r *postgresResourceStore) Update(_ context.Context, resource model.Resourc func (r *postgresResourceStore) Delete(_ context.Context, resource model.Resource, fs ...store.DeleteOptionsFunc) error { opts := store.NewDeleteOptions(fs...) - statement := `DELETE FROM resources WHERE name=$1 AND namespace=$2 AND type=$3 AND mesh=$4` - result, err := r.db.Exec(statement, opts.Name, opts.Namespace, resource.GetType(), opts.Mesh) + statement := `DELETE FROM resources WHERE name=$1 AND type=$2 AND mesh=$3` + result, err := r.db.Exec(statement, opts.Name, resource.GetType(), opts.Mesh) if err != nil { return errors.Wrapf(err, "failed to execute query: %s", statement) } if rows, _ := result.RowsAffected(); rows == 0 { // error ignored, postgres supports RowsAffected() - return store.ErrorResourceNotFound(resource.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(resource.GetType(), opts.Name, opts.Mesh) } return nil @@ -133,14 +130,14 @@ func (r *postgresResourceStore) Delete(_ context.Context, resource model.Resourc func (r *postgresResourceStore) Get(_ context.Context, resource model.Resource, fs ...store.GetOptionsFunc) error { opts := store.NewGetOptions(fs...) - statement := `SELECT spec, version FROM resources WHERE name=$1 AND namespace=$2 AND mesh=$3 AND type=$4;` - row := r.db.QueryRow(statement, opts.Name, opts.Namespace, opts.Mesh, resource.GetType()) + statement := `SELECT spec, version FROM resources WHERE name=$1 AND mesh=$2 AND type=$3;` + row := r.db.QueryRow(statement, opts.Name, opts.Mesh, resource.GetType()) var spec string var version int err := row.Scan(&spec, &version) if err == sql.ErrNoRows { - return store.ErrorResourceNotFound(resource.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(resource.GetType(), opts.Name, opts.Mesh) } if err != nil { return errors.Wrapf(err, "failed to execute query: %s", statement) @@ -151,10 +148,9 @@ func (r *postgresResourceStore) Get(_ context.Context, resource model.Resource, } meta := &resourceMetaObject{ - Name: opts.Name, - Namespace: opts.Namespace, - Mesh: opts.Mesh, - Version: strconv.Itoa(version), + Name: opts.Name, + Mesh: opts.Mesh, + Version: strconv.Itoa(version), } resource.SetMeta(meta) return nil @@ -163,15 +159,10 @@ func (r *postgresResourceStore) Get(_ context.Context, resource model.Resource, func (r *postgresResourceStore) List(_ context.Context, resources model.ResourceList, args ...store.ListOptionsFunc) error { opts := store.NewListOptions(args...) - statement := `SELECT name, namespace, mesh, spec, version FROM resources WHERE type=$1` + statement := `SELECT name, mesh, spec, version FROM resources WHERE type=$1` var statementArgs []interface{} statementArgs = append(statementArgs, resources.GetItemType()) argsIndex := 1 - if opts.Namespace != "" { - argsIndex++ - statement += fmt.Sprintf(" AND namespace=$%d", argsIndex) - statementArgs = append(statementArgs, opts.Namespace) - } if opts.Mesh != "" { argsIndex++ statement += fmt.Sprintf(" AND mesh=$%d", argsIndex) @@ -196,9 +187,9 @@ func (r *postgresResourceStore) List(_ context.Context, resources model.Resource } func rowToItem(resources model.ResourceList, rows *sql.Rows) (model.Resource, error) { - var name, namespace, mesh, spec string + var name, mesh, spec string var version int - if err := rows.Scan(&name, &namespace, &mesh, &spec, &version); err != nil { + if err := rows.Scan(&name, &mesh, &spec, &version); err != nil { return nil, errors.Wrap(err, "failed to retrieve elements from query") } @@ -208,10 +199,9 @@ func rowToItem(resources model.ResourceList, rows *sql.Rows) (model.Resource, er } meta := &resourceMetaObject{ - Name: name, - Namespace: namespace, - Mesh: mesh, - Version: strconv.Itoa(version), + Name: name, + Mesh: mesh, + Version: strconv.Itoa(version), } item.SetMeta(meta) @@ -223,10 +213,9 @@ func (r *postgresResourceStore) Close() error { } type resourceMetaObject struct { - Name string - Namespace string - Version string - Mesh string + Name string + Version string + Mesh string } var _ model.ResourceMeta = &resourceMetaObject{} @@ -235,10 +224,6 @@ func (r *resourceMetaObject) GetName() string { return r.Name } -func (r *resourceMetaObject) GetNamespace() string { - return r.Namespace -} - func (r *resourceMetaObject) GetVersion() string { return r.Version } diff --git a/pkg/plugins/resources/remote/store.go b/pkg/plugins/resources/remote/store.go index 8022c9629e65..2e84b0384453 100644 --- a/pkg/plugins/resources/remote/store.go +++ b/pkg/plugins/resources/remote/store.go @@ -80,10 +80,9 @@ func (s *remoteStore) upsert(ctx context.Context, res model.Resource, meta rest. return errors.Errorf("(%d): %s", statusCode, string(b)) } res.SetMeta(remoteMeta{ - Namespace: "", - Name: meta.Name, - Mesh: meta.Mesh, - Version: "", + Name: meta.Name, + Mesh: meta.Mesh, + Version: "", }) return nil } @@ -100,7 +99,7 @@ func (s *remoteStore) Delete(ctx context.Context, res model.Resource, fs ...stor statusCode, b, err := s.doRequest(ctx, req) if err != nil { if statusCode == 404 { - return store.ErrorResourceNotFound(res.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(res.GetType(), opts.Name, opts.Mesh) } return err } @@ -122,7 +121,7 @@ func (s *remoteStore) Get(ctx context.Context, res model.Resource, fs ...store.G statusCode, b, err := s.doRequest(ctx, req) if err != nil { if statusCode == 404 { - return store.ErrorResourceNotFound(res.GetType(), opts.Namespace, opts.Name, opts.Mesh) + return store.ErrorResourceNotFound(res.GetType(), opts.Name, opts.Mesh) } return err } diff --git a/pkg/plugins/resources/remote/store_test.go b/pkg/plugins/resources/remote/store_test.go index c4fecd574422..99b676c54e92 100644 --- a/pkg/plugins/resources/remote/store_test.go +++ b/pkg/plugins/resources/remote/store_test.go @@ -83,7 +83,7 @@ var _ = Describe("RemoteStore", func() { // when resource := sample_core.TrafficRouteResource{} - err := store.Get(context.Background(), &resource, core_store.GetByKey("", name, "default")) + err := store.Get(context.Background(), &resource, core_store.GetByKey(name, "default")) // then Expect(err).ToNot(HaveOccurred()) @@ -91,7 +91,6 @@ var _ = Describe("RemoteStore", func() { Expect(resource.GetMeta().GetName()).To(Equal("res-1")) Expect(resource.GetMeta().GetMesh()).To(Equal("default")) - Expect(resource.GetMeta().GetNamespace()).To(Equal("")) }) It("should get mesh resource", func() { @@ -102,14 +101,13 @@ var _ = Describe("RemoteStore", func() { // when resource := mesh.MeshResource{} - err := store.Get(context.Background(), &resource, core_store.GetByKey("", meshName, meshName)) + err := store.Get(context.Background(), &resource, core_store.GetByKey(meshName, meshName)) // then Expect(err).ToNot(HaveOccurred()) Expect(resource.GetMeta().GetName()).To(Equal(meshName)) Expect(resource.GetMeta().GetMesh()).To(Equal(meshName)) - Expect(resource.GetMeta().GetNamespace()).To(Equal("")) }) It("should parse kuma api server error", func() { @@ -123,7 +121,7 @@ var _ = Describe("RemoteStore", func() { // when resource := mesh.MeshResource{} - err := store.Get(context.Background(), &resource, core_store.GetByKey("", "test", "test")) + err := store.Get(context.Background(), &resource, core_store.GetByKey("test", "test")) // then Expect(err).To(HaveOccurred()) @@ -145,7 +143,7 @@ var _ = Describe("RemoteStore", func() { // when resource := mesh.MeshResource{} - err := store.Get(context.Background(), &resource, core_store.GetByKey("", "test", "test")) + err := store.Get(context.Background(), &resource, core_store.GetByKey("test", "test")) // then Expect(core_store.IsResourceNotFound(err)).To(BeTrue()) @@ -169,7 +167,7 @@ var _ = Describe("RemoteStore", func() { Path: "/some-path", }, } - err := store.Create(context.Background(), &resource, core_store.CreateByKey("", name, "default")) + err := store.Create(context.Background(), &resource, core_store.CreateByKey(name, "default")) // then Expect(err).ToNot(HaveOccurred()) @@ -189,7 +187,7 @@ var _ = Describe("RemoteStore", func() { resource := mesh.MeshResource{ Spec: v1alpha1.Mesh{}, } - err := store.Create(context.Background(), &resource, core_store.CreateByKey("", meshName, meshName)) + err := store.Create(context.Background(), &resource, core_store.CreateByKey(meshName, meshName)) // then Expect(err).ToNot(HaveOccurred()) @@ -211,7 +209,7 @@ var _ = Describe("RemoteStore", func() { store := setupErrorStore(400, json) // when - err := store.Create(context.Background(), &mesh.MeshResource{}, core_store.CreateByKey("", "test", "test")) + err := store.Create(context.Background(), &mesh.MeshResource{}, core_store.CreateByKey("test", "test")) // then Expect(err).To(HaveOccurred()) @@ -245,9 +243,8 @@ var _ = Describe("RemoteStore", func() { Path: "/some-path", }, Meta: &model.ResourceMeta{ - Mesh: "default", - Name: name, - Namespace: "", + Mesh: "default", + Name: name, }, } err := store.Update(context.Background(), &resource) @@ -278,9 +275,8 @@ var _ = Describe("RemoteStore", func() { }, }, Meta: &model.ResourceMeta{ - Mesh: meshName, - Name: meshName, - Namespace: "", + Mesh: meshName, + Name: meshName, }, } err := store.Update(context.Background(), &resource) @@ -297,9 +293,8 @@ var _ = Describe("RemoteStore", func() { resource := mesh.MeshResource{ Spec: v1alpha1.Mesh{}, Meta: &model.ResourceMeta{ - Mesh: "default", - Name: "default", - Namespace: "", + Mesh: "default", + Name: "default", }, } err := store.Create(context.Background(), &resource) @@ -371,13 +366,11 @@ var _ = Describe("RemoteStore", func() { Expect(err).ToNot(HaveOccurred()) Expect(rs.Items).To(HaveLen(2)) // and - Expect(rs.Items[0].Meta.GetNamespace()).To(Equal("")) Expect(rs.Items[0].Meta.GetName()).To(Equal("one")) Expect(rs.Items[0].Meta.GetMesh()).To(Equal("default")) Expect(rs.Items[0].Meta.GetVersion()).To(Equal("")) Expect(rs.Items[0].Spec.Path).To(Equal("/example")) // and - Expect(rs.Items[1].Meta.GetNamespace()).To(Equal("")) Expect(rs.Items[1].Meta.GetName()).To(Equal("two")) Expect(rs.Items[1].Meta.GetMesh()).To(Equal("pilot")) Expect(rs.Items[1].Meta.GetVersion()).To(Equal("")) @@ -398,11 +391,9 @@ var _ = Describe("RemoteStore", func() { Expect(err).ToNot(HaveOccurred()) Expect(meshes.Items).To(HaveLen(2)) - Expect(meshes.Items[0].Meta.GetNamespace()).To(Equal("")) Expect(meshes.Items[0].Meta.GetName()).To(Equal("mesh-1")) Expect(meshes.Items[0].Meta.GetMesh()).To(Equal("mesh-1")) - Expect(meshes.Items[1].Meta.GetNamespace()).To(Equal("")) Expect(meshes.Items[1].Meta.GetName()).To(Equal("mesh-2")) Expect(meshes.Items[1].Meta.GetMesh()).To(Equal("mesh-2")) }) @@ -453,7 +444,7 @@ var _ = Describe("RemoteStore", func() { // when resource := sample_core.TrafficRouteResource{} - err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("default", name, meshName)) + err := store.Delete(context.Background(), &resource, core_store.DeleteByKey(name, meshName)) // then Expect(err).ToNot(HaveOccurred()) @@ -468,7 +459,7 @@ var _ = Describe("RemoteStore", func() { // when resource := mesh.MeshResource{} - err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("default", meshName, meshName)) + err := store.Delete(context.Background(), &resource, core_store.DeleteByKey(meshName, meshName)) // then Expect(err).ToNot(HaveOccurred()) @@ -480,7 +471,7 @@ var _ = Describe("RemoteStore", func() { // when resource := sample_core.TrafficRouteResource{} - err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("default", "tr-1", "mesh-1")) + err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("tr-1", "mesh-1")) // then Expect(err).To(MatchError("(400): some error from the server")) @@ -497,7 +488,7 @@ var _ = Describe("RemoteStore", func() { // when resource := sample_core.TrafficRouteResource{} - err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("default", "tr-1", "mesh-1")) + err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("tr-1", "mesh-1")) // then Expect(core_store.IsResourceNotFound(err)).To(BeTrue()) @@ -513,7 +504,7 @@ var _ = Describe("RemoteStore", func() { // when resource := sample_core.TrafficRouteResource{} - err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("default", "tr-1", "mesh-1")) + err := store.Delete(context.Background(), &resource, core_store.DeleteByKey("tr-1", "mesh-1")) // then Expect(err).To(HaveOccurred()) diff --git a/pkg/plugins/resources/remote/unmarshalling.go b/pkg/plugins/resources/remote/unmarshalling.go index 69d869dbc5d5..1b3a836ffb66 100644 --- a/pkg/plugins/resources/remote/unmarshalling.go +++ b/pkg/plugins/resources/remote/unmarshalling.go @@ -7,18 +7,14 @@ import ( ) type remoteMeta struct { - Namespace string - Name string - Mesh string - Version string + Name string + Mesh string + Version string } func (m remoteMeta) GetName() string { return m.Name } -func (m remoteMeta) GetNamespace() string { - return m.Namespace -} func (m remoteMeta) GetMesh() string { return m.Mesh } @@ -34,10 +30,9 @@ func Unmarshal(b []byte, res model.Resource) error { return err } res.SetMeta(remoteMeta{ - Namespace: "", - Name: restResource.Meta.Name, - Mesh: restResource.Meta.Mesh, - Version: "", + Name: restResource.Meta.Name, + Mesh: restResource.Meta.Mesh, + Version: "", }) return nil } @@ -55,10 +50,9 @@ func UnmarshalList(b []byte, rs model.ResourceList) error { return err } r.SetMeta(&remoteMeta{ - Namespace: "", - Name: ri.Meta.Name, - Mesh: ri.Meta.Mesh, - Version: "", + Name: ri.Meta.Name, + Mesh: ri.Meta.Mesh, + Version: "", }) _ = rs.AddItem(r) } diff --git a/pkg/plugins/runtime/k8s/controllers/mesh_controller.go b/pkg/plugins/runtime/k8s/controllers/mesh_controller.go index 4e790d9e0c46..f48914a248ae 100644 --- a/pkg/plugins/runtime/k8s/controllers/mesh_controller.go +++ b/pkg/plugins/runtime/k8s/controllers/mesh_controller.go @@ -43,7 +43,7 @@ func (r *MeshReconciler) Reconcile(req kube_ctrl.Request) (kube_ctrl.Result, err mesh := &mesh_k8s.Mesh{} if err := r.Get(ctx, req.NamespacedName, mesh); err != nil { if kube_apierrs.IsNotFound(err) { - err := r.ResourceManager.Delete(ctx, &mesh_core.MeshResource{}, store.DeleteByKey(req.Namespace, req.Name, req.Name)) + err := r.ResourceManager.Delete(ctx, &mesh_core.MeshResource{}, store.DeleteByKey(req.Name, req.Name)) return kube_ctrl.Result{}, err } log.Error(err, "unable to fetch Mesh") diff --git a/pkg/plugins/runtime/k8s/controllers/namespace_controller.go b/pkg/plugins/runtime/k8s/controllers/namespace_controller.go index a719355fecd3..b2451b6f6dce 100644 --- a/pkg/plugins/runtime/k8s/controllers/namespace_controller.go +++ b/pkg/plugins/runtime/k8s/controllers/namespace_controller.go @@ -2,7 +2,6 @@ package controllers import ( "context" - "github.com/go-logr/logr" "github.com/pkg/errors" @@ -11,7 +10,6 @@ import ( core_manager "github.com/Kong/kuma/pkg/core/resources/manager" core_model "github.com/Kong/kuma/pkg/core/resources/model" mesh_k8s "github.com/Kong/kuma/pkg/plugins/resources/k8s/native/api/v1alpha1" - kube_core "k8s.io/api/core/v1" kube_apierrs "k8s.io/apimachinery/pkg/api/errors" kube_types "k8s.io/apimachinery/pkg/types" @@ -52,10 +50,10 @@ func (r *NamespaceReconciler) Reconcile(req kube_ctrl.Request) (kube_ctrl.Result // Fetch default Mesh instance mesh := &mesh_k8s.Mesh{} - name := kube_types.NamespacedName{Namespace: r.SystemNamespace, Name: core_model.DefaultMesh} + name := kube_types.NamespacedName{Name: core_model.DefaultMesh} if err := r.Get(ctx, name, mesh); err != nil { if kube_apierrs.IsNotFound(err) { - err := mesh_managers.CreateDefaultMesh(r.ResourceManager, r.DefaultMeshTemplate, r.SystemNamespace) + err := mesh_managers.CreateDefaultMesh(r.ResourceManager, r.DefaultMeshTemplate) if err != nil { log.Error(err, "unable to create default Mesh") } diff --git a/pkg/plugins/secrets/k8s/store.go b/pkg/plugins/secrets/k8s/store.go index 2ef0dd1f1d3d..66fe92da28ee 100644 --- a/pkg/plugins/secrets/k8s/store.go +++ b/pkg/plugins/secrets/k8s/store.go @@ -51,7 +51,7 @@ func (s *KubernetesStore) Create(ctx context.Context, r *secret_model.SecretReso if err := s.writer.Create(ctx, secret); err != nil { if kube_apierrs.IsAlreadyExists(err) { - return core_store.ErrorResourceAlreadyExists(r.GetType(), secret.Namespace, secret.Name, noMesh) + return core_store.ErrorResourceAlreadyExists(r.GetType(), secret.Name, noMesh) } return errors.Wrap(err, "failed to create k8s Secret") } @@ -69,7 +69,7 @@ func (s *KubernetesStore) Update(ctx context.Context, r *secret_model.SecretReso secret.Namespace = s.namespace if err := s.writer.Update(ctx, secret); err != nil { if kube_apierrs.IsConflict(err) { - return core_store.ErrorResourceConflict(r.GetType(), secret.Namespace, secret.Name, noMesh) + return core_store.ErrorResourceConflict(r.GetType(), secret.Name, noMesh) } return errors.Wrap(err, "failed to update k8s Secret") } @@ -101,7 +101,7 @@ func (s *KubernetesStore) Get(ctx context.Context, r *secret_model.SecretResourc secret := &kube_core.Secret{} if err := s.reader.Get(ctx, kube_client.ObjectKey{Namespace: s.namespace, Name: opts.Name}, secret); err != nil { if kube_apierrs.IsNotFound(err) { - return core_store.ErrorResourceNotFound(r.GetType(), s.namespace, opts.Name, noMesh) + return core_store.ErrorResourceNotFound(r.GetType(), opts.Name, noMesh) } return errors.Wrap(err, "failed to get k8s secret") } diff --git a/pkg/plugins/secrets/k8s/store_test.go b/pkg/plugins/secrets/k8s/store_test.go index 0ef2d6569983..2f5478147ccd 100644 --- a/pkg/plugins/secrets/k8s/store_test.go +++ b/pkg/plugins/secrets/k8s/store_test.go @@ -97,12 +97,11 @@ var _ = Describe("KubernetesStore", func() { `).(*kube_core.Secret) // when - err := s.Create(context.Background(), secret, store.CreateByKey("ignored", name, noMesh)) + err := s.Create(context.Background(), secret, store.CreateByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) // and - Expect(secret.Meta.GetNamespace()).To(Equal(ns)) Expect(secret.Meta.GetName()).To(Equal(name)) Expect(secret.Meta.GetMesh()).To(Equal("")) Expect(secret.Meta.GetVersion()).ToNot(Equal("")) @@ -123,16 +122,16 @@ var _ = Describe("KubernetesStore", func() { backend.AssertNotExists(&kube_core.Secret{}, "ignored", name) // when - err := s.Create(context.Background(), &secret_model.SecretResource{}, store.CreateByKey("ignored", name, noMesh)) + err := s.Create(context.Background(), &secret_model.SecretResource{}, store.CreateByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) // when - err = s.Create(context.Background(), &secret_model.SecretResource{}, store.CreateByKey("ignored", name, noMesh)) + err = s.Create(context.Background(), &secret_model.SecretResource{}, store.CreateByKey(name, noMesh)) // then - Expect(err).To(MatchError(store.ErrorResourceAlreadyExists(core_system.SecretType, ns, name, noMesh))) + Expect(err).To(MatchError(store.ErrorResourceAlreadyExists(core_system.SecretType, name, noMesh))) }) }) @@ -163,7 +162,7 @@ var _ = Describe("KubernetesStore", func() { secret := &secret_model.SecretResource{} // when - err := s.Get(context.Background(), secret, store.GetByKey("ignored", name, noMesh)) + err := s.Get(context.Background(), secret, store.GetByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) version := secret.Meta.GetVersion() @@ -205,7 +204,7 @@ var _ = Describe("KubernetesStore", func() { secret := &secret_model.SecretResource{} // when - err := s.Get(context.Background(), secret, store.GetByKey("ignored", name, noMesh)) + err := s.Get(context.Background(), secret, store.GetByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -215,7 +214,7 @@ var _ = Describe("KubernetesStore", func() { err = s.Update(context.Background(), secret) // then - Expect(err).To(MatchError(store.ErrorResourceConflict(core_system.SecretType, ns, name, noMesh))) + Expect(err).To(MatchError(store.ErrorResourceConflict(core_system.SecretType, name, noMesh))) }) It("should return an error if resource has changed", func() { @@ -234,7 +233,7 @@ var _ = Describe("KubernetesStore", func() { secret1 := &secret_model.SecretResource{} // when - err := s.Get(context.Background(), secret1, store.GetByKey("ignored", name, noMesh)) + err := s.Get(context.Background(), secret1, store.GetByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -242,7 +241,7 @@ var _ = Describe("KubernetesStore", func() { secret2 := &secret_model.SecretResource{} // when - err = s.Get(context.Background(), secret2, store.GetByKey("ignored", name, noMesh)) + err = s.Get(context.Background(), secret2, store.GetByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -256,7 +255,7 @@ var _ = Describe("KubernetesStore", func() { secret2.Spec.Value = []byte("another") err = s.Update(context.Background(), secret2) // then - Expect(err).To(MatchError(store.ErrorResourceConflict(core_system.SecretType, ns, name, noMesh))) + Expect(err).To(MatchError(store.ErrorResourceConflict(core_system.SecretType, name, noMesh))) }) }) @@ -266,10 +265,10 @@ var _ = Describe("KubernetesStore", func() { backend.AssertNotExists(&kube_core.Secret{}, ns, name) // when - err := s.Get(context.Background(), &secret_model.SecretResource{}, store.GetByKey("ignored", name, noMesh)) + err := s.Get(context.Background(), &secret_model.SecretResource{}, store.GetByKey(name, noMesh)) // then - Expect(err).To(MatchError(store.ErrorResourceNotFound(core_system.SecretType, ns, name, noMesh))) + Expect(err).To(MatchError(store.ErrorResourceNotFound(core_system.SecretType, name, noMesh))) }) It("should return an existing resource", func() { @@ -290,12 +289,11 @@ var _ = Describe("KubernetesStore", func() { actual := &secret_model.SecretResource{} // when - err := s.Get(context.Background(), actual, store.GetByKey("ignored", name, noMesh)) + err := s.Get(context.Background(), actual, store.GetByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) // and - Expect(actual.Meta.GetNamespace()).To(Equal(ns)) Expect(actual.Meta.GetName()).To(Equal(name)) // and Expect(actual.Spec.Value).To(Equal([]byte("example"))) @@ -308,7 +306,7 @@ var _ = Describe("KubernetesStore", func() { backend.AssertNotExists(&kube_core.Secret{}, ns, name) // when - err := s.Delete(context.Background(), &secret_model.SecretResource{}, store.DeleteByKey("ignored", name, noMesh)) + err := s.Delete(context.Background(), &secret_model.SecretResource{}, store.DeleteByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -327,7 +325,7 @@ var _ = Describe("KubernetesStore", func() { backend.Create(initial) // when - err := s.Delete(context.Background(), &secret_model.SecretResource{}, store.DeleteByKey("ignored", name, noMesh)) + err := s.Delete(context.Background(), &secret_model.SecretResource{}, store.DeleteByKey(name, noMesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -342,7 +340,7 @@ var _ = Describe("KubernetesStore", func() { secrets := &secret_model.SecretResourceList{} // when - err := s.List(context.Background(), secrets, store.ListByNamespace("ignored"), store.ListByMesh("ignored")) + err := s.List(context.Background(), secrets, store.ListByMesh("ignored")) // then Expect(err).ToNot(HaveOccurred()) @@ -380,7 +378,7 @@ var _ = Describe("KubernetesStore", func() { secrets := &secret_model.SecretResourceList{} // when - err := s.List(context.Background(), secrets, store.ListByNamespace("ignored")) + err := s.List(context.Background(), secrets) // then Expect(err).ToNot(HaveOccurred()) @@ -393,10 +391,8 @@ var _ = Describe("KubernetesStore", func() { secrets.Items[1].Meta.GetName(): secrets.Items[1], } // then - Expect(items["one"].Meta.GetNamespace()).To(Equal(ns)) Expect(items["one"].Spec.Value).To(Equal([]byte("example"))) // and - Expect(items["two"].Meta.GetNamespace()).To(Equal(ns)) Expect(items["two"].Spec.Value).To(Equal([]byte("another"))) }) }) diff --git a/pkg/sds/auth/k8s/authenticator.go b/pkg/sds/auth/k8s/authenticator.go index 6209845ca46c..afa6178fdc30 100644 --- a/pkg/sds/auth/k8s/authenticator.go +++ b/pkg/sds/auth/k8s/authenticator.go @@ -9,6 +9,7 @@ import ( core_xds "github.com/Kong/kuma/pkg/core/xds" sds_auth "github.com/Kong/kuma/pkg/sds/auth" common_auth "github.com/Kong/kuma/pkg/sds/auth/common" + util_k8s "github.com/Kong/kuma/pkg/util/k8s" kube_auth "k8s.io/api/authentication/v1" kube_client "sigs.k8s.io/controller-runtime/pkg/client" @@ -62,9 +63,13 @@ func (k *kubeAuthenticator) reviewToken(ctx context.Context, proxyId core_xds.Pr if !(userInfo[0] == "system" && userInfo[1] == "serviceaccount") { return errors.Errorf("authentication failed: token must belong to a k8s system account, got %q", tokenReview.Status.User.Username) } + _, proxyNamespace, err := util_k8s.CoreNameToK8sName(proxyId.Name) + if err != nil { + return err + } namespace := userInfo[2] - if namespace != proxyId.Namespace { - return errors.Errorf("authentication failed: token belongs to a namespace (%q) different from proxyId (%q)", namespace, proxyId.Namespace) + if namespace != proxyNamespace { + return errors.Errorf("authentication failed: token belongs to a namespace (%q) different from proxyId (%q)", namespace, proxyNamespace) } return nil } diff --git a/pkg/sds/auth/universal/auth_test.go b/pkg/sds/auth/universal/auth_test.go index 54a6085aa49d..271763afa6c9 100644 --- a/pkg/sds/auth/universal/auth_test.go +++ b/pkg/sds/auth/universal/auth_test.go @@ -34,9 +34,8 @@ var _ = Describe("Authentication flow", func() { It("should correctly authenticate dataplane", func() { // given id := xds.ProxyId{ - Mesh: "example", - Namespace: "default", - Name: "dp-1", + Mesh: "example", + Name: "dp-1", } dpRes := core_mesh.DataplaneResource{ @@ -74,9 +73,8 @@ var _ = Describe("Authentication flow", func() { It("should throw an error on invalid token", func() { // when id := xds.ProxyId{ - Mesh: "default", - Namespace: "default", - Name: "dp1", + Mesh: "default", + Name: "dp1", } _, err := authenticator.Authenticate(context.Background(), id, "this-is-not-valid-jwt-token") @@ -87,9 +85,8 @@ var _ = Describe("Authentication flow", func() { It("should throw an error on token with different name", func() { // when generateId := xds.ProxyId{ - Mesh: "default", - Namespace: "default", - Name: "different-name-than-dp1", + Mesh: "default", + Name: "different-name-than-dp1", } token, err := issuer.Generate(generateId) @@ -98,9 +95,8 @@ var _ = Describe("Authentication flow", func() { // when authId := xds.ProxyId{ - Mesh: "default", - Namespace: "default", - Name: "dp1", + Mesh: "default", + Name: "dp1", } _, err = authenticator.Authenticate(context.Background(), authId, token) @@ -111,9 +107,8 @@ var _ = Describe("Authentication flow", func() { It("should throw an error on token with different mesh", func() { // when generateId := xds.ProxyId{ - Mesh: "different-mesh-than-default", - Namespace: "default", - Name: "dp1", + Mesh: "different-mesh-than-default", + Name: "dp1", } token, err := issuer.Generate(generateId) @@ -122,9 +117,8 @@ var _ = Describe("Authentication flow", func() { // when authId := xds.ProxyId{ - Mesh: "default", - Namespace: "default", - Name: "dp1", + Mesh: "default", + Name: "dp1", } _, err = authenticator.Authenticate(context.Background(), authId, token) @@ -135,9 +129,8 @@ var _ = Describe("Authentication flow", func() { It("should throw an error when dataplane is not present in CP", func() { // given id := xds.ProxyId{ - Mesh: "default", - Namespace: "default", - Name: "non-existent-dp", + Mesh: "default", + Name: "non-existent-dp", } // when @@ -150,6 +143,6 @@ var _ = Describe("Authentication flow", func() { _, err = authenticator.Authenticate(context.Background(), id, token) // then - Expect(err).To(MatchError(`unable to find Dataplane for proxy {"default" "default" "non-existent-dp"}: Resource not found: type="Dataplane" namespace="default" name="non-existent-dp" mesh="default"`)) + Expect(err).To(MatchError(`unable to find Dataplane for proxy {"default" "non-existent-dp"}: Resource not found: type="Dataplane" name="non-existent-dp" mesh="default"`)) }) }) diff --git a/pkg/sds/auth/universal/noop_authenticator_test.go b/pkg/sds/auth/universal/noop_authenticator_test.go index cce9310c9622..88602c82ea5a 100644 --- a/pkg/sds/auth/universal/noop_authenticator_test.go +++ b/pkg/sds/auth/universal/noop_authenticator_test.go @@ -30,9 +30,8 @@ var _ = Describe("Noop Authenticator", func() { It("should allow with any token for existing dataplane", func() { // given id := xds.ProxyId{ - Mesh: "example", - Namespace: "default", - Name: "dp-1", + Mesh: "example", + Name: "dp-1", } dpRes := core_mesh.DataplaneResource{ @@ -64,9 +63,8 @@ var _ = Describe("Noop Authenticator", func() { It("should throw an error when dataplane is not present in CP", func() { // given id := xds.ProxyId{ - Mesh: "example", - Namespace: "default", - Name: "dp-1", + Mesh: "example", + Name: "dp-1", } // when @@ -74,6 +72,6 @@ var _ = Describe("Noop Authenticator", func() { // then Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError(`unable to find Dataplane for proxy {"example" "default" "dp-1"}: Resource not found: type="Dataplane" namespace="default" name="dp-1" mesh="example"`)) + Expect(err).To(MatchError(`unable to find Dataplane for proxy {"example" "dp-1"}: Resource not found: type="Dataplane" name="dp-1" mesh="example"`)) }) }) diff --git a/pkg/test/resources/model/resource.go b/pkg/test/resources/model/resource.go index 8b8f1b650bbf..62510c3d7174 100644 --- a/pkg/test/resources/model/resource.go +++ b/pkg/test/resources/model/resource.go @@ -7,18 +7,14 @@ import ( var _ core_model.ResourceMeta = &ResourceMeta{} type ResourceMeta struct { - Mesh string - Namespace string - Name string - Version string + Mesh string + Name string + Version string } func (m *ResourceMeta) GetMesh() string { return m.Mesh } -func (m *ResourceMeta) GetNamespace() string { - return m.Namespace -} func (m *ResourceMeta) GetName() string { return m.Name } diff --git a/pkg/test/store/store_test_template.go b/pkg/test/store/store_test_template.go index f9e8ba3bd326..f0c23753d6f4 100644 --- a/pkg/test/store/store_test_template.go +++ b/pkg/test/store/store_test_template.go @@ -7,18 +7,15 @@ import ( sample_model "github.com/Kong/kuma/pkg/test/resources/apis/sample" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/pborman/uuid" ) func ExecuteStoreTests( createStore func() store.ResourceStore, ) { - var namespace string const mesh = "default-mesh" var s store.ClosableResourceStore BeforeEach(func() { - namespace = uuid.New() s = store.NewStrictResourceStore(createStore()) }) @@ -27,13 +24,23 @@ func ExecuteStoreTests( Expect(err).ToNot(HaveOccurred()) }) + BeforeEach(func() { + list := sample_model.TrafficRouteResourceList{} + err := s.List(context.Background(), &list) + Expect(err).ToNot(HaveOccurred()) + for _, item := range list.Items { + err := s.Delete(context.Background(), item, store.DeleteByKey(item.Meta.GetName(), item.Meta.GetMesh())) + Expect(err).ToNot(HaveOccurred()) + } + }) + createResource := func(name string) *sample_model.TrafficRouteResource { res := sample_model.TrafficRouteResource{ Spec: sample_proto.TrafficRoute{ Path: "demo", }, } - err := s.Create(context.Background(), &res, store.CreateByKey(namespace, name, mesh)) + err := s.Create(context.Background(), &res, store.CreateByKey(name, mesh)) Expect(err).ToNot(HaveOccurred()) return &res } @@ -41,21 +48,20 @@ func ExecuteStoreTests( Describe("Create()", func() { It("should create a new resource", func() { // given - name := "resource1" + name := "resource1.demo" // when created := createResource(name) // when retrieve created object resource := sample_model.TrafficRouteResource{} - err := s.Get(context.Background(), &resource, store.GetByKey(namespace, name, mesh)) + err := s.Get(context.Background(), &resource, store.GetByKey(name, mesh)) // then Expect(err).ToNot(HaveOccurred()) // and it has same data Expect(resource.Meta.GetName()).To(Equal(name)) - Expect(resource.Meta.GetNamespace()).To(Equal(namespace)) Expect(resource.Meta.GetMesh()).To(Equal(mesh)) Expect(resource.Meta.GetVersion()).ToNot(BeEmpty()) Expect(resource.Spec).To(Equal(created.Spec)) @@ -63,29 +69,29 @@ func ExecuteStoreTests( It("should not create a duplicate record", func() { // given - name := "duplicated-record" + name := "duplicated-record.demo" resource := createResource(name) // when try to create another one with same name resource.SetMeta(nil) - err := s.Create(context.Background(), resource, store.CreateByKey(namespace, name, mesh)) + err := s.Create(context.Background(), resource, store.CreateByKey(name, mesh)) // then - Expect(err).To(MatchError(store.ErrorResourceAlreadyExists(resource.GetType(), namespace, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceAlreadyExists(resource.GetType(), name, mesh))) }) }) Describe("Update()", func() { It("should return an error if resource is not found", func() { // given - name := "to-be-updated" + name := "to-be-updated.demo" resource := createResource(name) // when delete resource err := s.Delete( context.Background(), resource, - store.DeleteByKey(resource.GetMeta().GetNamespace(), resource.Meta.GetName(), mesh), + store.DeleteByKey(resource.Meta.GetName(), mesh), ) // then @@ -95,12 +101,12 @@ func ExecuteStoreTests( err = s.Update(context.Background(), resource) // then - Expect(err).To(MatchError(store.ErrorResourceConflict(resource.GetType(), namespace, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceConflict(resource.GetType(), name, mesh))) }) It("should update an existing resource", func() { // given a resources in storage - name := "to-be-updated" + name := "to-be-updated.demo" resource := createResource(name) // when @@ -112,7 +118,7 @@ func ExecuteStoreTests( // when retrieve the resource res := sample_model.TrafficRouteResource{} - err = s.Get(context.Background(), &res, store.GetByKey(namespace, name, mesh)) + err = s.Get(context.Background(), &res, store.GetByKey(name, mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -127,24 +133,25 @@ func ExecuteStoreTests( Describe("Delete()", func() { It("should throw an error if resource is not found", func() { // given + name := "non-existent-name.demo" resource := sample_model.TrafficRouteResource{} // when - err := s.Delete(context.TODO(), &resource, store.DeleteByKey(namespace, "non-existent-name", mesh)) + err := s.Delete(context.TODO(), &resource, store.DeleteByKey(name, mesh)) // then Expect(err).To(HaveOccurred()) - Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), namespace, "non-existent-name", mesh))) + Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), name, mesh))) }) It("should not delete resource from another mesh", func() { // given - name := "tr-1" + name := "tr-1.demo" resource := createResource(name) // when resource.SetMeta(nil) // otherwise the validation from strict client fires that mesh is different - err := s.Delete(context.TODO(), resource, store.DeleteByKey(namespace, name, "different-mesh")) + err := s.Delete(context.TODO(), resource, store.DeleteByKey(name, "different-mesh")) // then Expect(err).To(HaveOccurred()) @@ -152,7 +159,7 @@ func ExecuteStoreTests( // and when getting the given resource getResource := sample_model.TrafficRouteResource{} - err = s.Get(context.Background(), &getResource, store.GetByKey(namespace, name, mesh)) + err = s.Get(context.Background(), &getResource, store.GetByKey(name, mesh)) // then resource still exists Expect(err).ToNot(HaveOccurred()) @@ -160,67 +167,66 @@ func ExecuteStoreTests( It("should delete an existing resource", func() { // given a resources in storage - name := "to-be-deleted" + name := "to-be-deleted.demo" createResource(name) // when resource := sample_model.TrafficRouteResource{} - err := s.Delete(context.TODO(), &resource, store.DeleteByKey(namespace, name, mesh)) + err := s.Delete(context.TODO(), &resource, store.DeleteByKey(name, mesh)) // then Expect(err).ToNot(HaveOccurred()) // when query for deleted resource resource = sample_model.TrafficRouteResource{} - err = s.Get(context.Background(), &resource, store.GetByKey(namespace, name, mesh)) + err = s.Get(context.Background(), &resource, store.GetByKey(name, mesh)) // then resource cannot be found - Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), namespace, name, mesh))) + Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), name, mesh))) }) }) Describe("Get()", func() { It("should return an error if resource is not found", func() { // given - name := "non-existing-resource" + name := "non-existing-resource.demo" resource := sample_model.TrafficRouteResource{} // when - err := s.Get(context.Background(), &resource, store.GetByKey(namespace, name, mesh)) + err := s.Get(context.Background(), &resource, store.GetByKey(name, mesh)) // then - Expect(err).To(MatchError(store.ErrorResourceNotFound(resource.GetType(), namespace, name, mesh))) + Expect(err).To(MatchError(store.ErrorResourceNotFound(resource.GetType(), name, mesh))) }) It("should return an error if resource is not found in given mesh", func() { // given a resources in mesh "mesh" - name := "existing-resource" + name := "existing-resource.demo" mesh := "different-mesh" createResource(name) // when resource := sample_model.TrafficRouteResource{} - err := s.Get(context.Background(), &resource, store.GetByKey(namespace, name, mesh)) + err := s.Get(context.Background(), &resource, store.GetByKey(name, mesh)) // then - Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), namespace, name, mesh))) + Expect(err).To(Equal(store.ErrorResourceNotFound(resource.GetType(), name, mesh))) }) It("should return an existing resource", func() { // given a resources in storage - name := "existing-resource" + name := "get-existing-resource.demo" createdResource := createResource(name) // when res := sample_model.TrafficRouteResource{} - err := s.Get(context.Background(), &res, store.GetByKey(namespace, name, mesh)) + err := s.Get(context.Background(), &res, store.GetByKey(name, mesh)) // then Expect(err).ToNot(HaveOccurred()) // and Expect(res.Meta.GetName()).To(Equal(name)) - Expect(res.Meta.GetNamespace()).To(Equal(namespace)) Expect(res.Meta.GetVersion()).ToNot(BeEmpty()) Expect(res.Spec).To(Equal(createdResource.Spec)) }) @@ -232,7 +238,7 @@ func ExecuteStoreTests( list := sample_model.TrafficRouteResourceList{} // when - err := s.List(context.Background(), &list, store.ListByNamespace("non-existent-namespace"), store.ListByMesh(mesh)) + err := s.List(context.Background(), &list, store.ListByMesh(mesh)) // then Expect(err).ToNot(HaveOccurred()) @@ -242,13 +248,13 @@ func ExecuteStoreTests( It("should return a list of resources", func() { // given two resources - createResource("res-1") - createResource("res-2") + createResource("res-1.demo") + createResource("res-2.demo") list := sample_model.TrafficRouteResourceList{} // when - err := s.List(context.Background(), &list, store.ListByNamespace(namespace)) + err := s.List(context.Background(), &list) // then Expect(err).ToNot(HaveOccurred()) @@ -256,35 +262,17 @@ func ExecuteStoreTests( Expect(list.Items).To(HaveLen(2)) // and names := []string{list.Items[0].Meta.GetName(), list.Items[1].Meta.GetName()} - Expect(names).To(ConsistOf("res-1", "res-2")) - Expect(list.Items[0].Meta.GetNamespace()).To(Equal(namespace)) + Expect(names).To(ConsistOf("res-1.demo", "res-2.demo")) Expect(list.Items[0].Meta.GetMesh()).To(Equal(mesh)) Expect(list.Items[0].Spec.Path).To(Equal("demo")) - Expect(list.Items[1].Meta.GetNamespace()).To(Equal(namespace)) Expect(list.Items[1].Meta.GetMesh()).To(Equal(mesh)) Expect(list.Items[1].Spec.Path).To(Equal("demo")) }) - It("should not return a list of resources in different namespace", func() { - // given two resources - createResource("res-1") - createResource("res-2") - - list := sample_model.TrafficRouteResourceList{} - - // when - err := s.List(context.Background(), &list, store.ListByNamespace("different-namespace")) - - // then - Expect(err).ToNot(HaveOccurred()) - // and - Expect(list.Items).To(HaveLen(0)) - }) - It("should not return a list of resources in different mesh", func() { // given two resources - createResource("res-1") - createResource("res-2") + createResource("list-res-1.demo") + createResource("list-res-2.demo") list := sample_model.TrafficRouteResourceList{} diff --git a/pkg/tokens/builtin/issuer/issuer.go b/pkg/tokens/builtin/issuer/issuer.go index 463f3406d6d3..b2bfe4693c7b 100644 --- a/pkg/tokens/builtin/issuer/issuer.go +++ b/pkg/tokens/builtin/issuer/issuer.go @@ -57,9 +57,8 @@ func (i *jwtTokenIssuer) Validate(credential auth.Credential) (xds.ProxyId, erro } id := xds.ProxyId{ - Mesh: c.Mesh, - Namespace: "default", // namespace is irrelevant as this is only used in Universal - Name: c.Name, + Mesh: c.Mesh, + Name: c.Name, } return id, nil } diff --git a/pkg/tokens/builtin/issuer/signing_key.go b/pkg/tokens/builtin/issuer/signing_key.go index 94ebd065091b..1e18ddf59351 100644 --- a/pkg/tokens/builtin/issuer/signing_key.go +++ b/pkg/tokens/builtin/issuer/signing_key.go @@ -18,9 +18,8 @@ import ( const defaultRsaBits = 2048 var signingKeyResourceKey = model.ResourceKey{ - Mesh: "default", - Namespace: "default", // namespace is irrelevant as this is only used in Universal - Name: "dataplane-token-signing-key", + Mesh: "default", + Name: "dataplane-token-signing-key", } func CreateDefaultSigningKey(manager core_manager.SecretManager) error { diff --git a/pkg/tokens/builtin/server/types/dataplane_token_request.go b/pkg/tokens/builtin/server/types/dataplane_token_request.go index 4b1b2348840f..8f4363b085af 100644 --- a/pkg/tokens/builtin/server/types/dataplane_token_request.go +++ b/pkg/tokens/builtin/server/types/dataplane_token_request.go @@ -9,8 +9,7 @@ type DataplaneTokenRequest struct { func (i DataplaneTokenRequest) ToProxyId() xds.ProxyId { return xds.ProxyId{ - Mesh: i.Mesh, - Namespace: "default", - Name: i.Name, + Mesh: i.Mesh, + Name: i.Name, } } diff --git a/pkg/util/k8s/name_converter.go b/pkg/util/k8s/name_converter.go new file mode 100644 index 000000000000..ddb5c478e9e4 --- /dev/null +++ b/pkg/util/k8s/name_converter.go @@ -0,0 +1,24 @@ +package k8s + +import ( + "fmt" + "github.com/pkg/errors" + "strings" +) + +func CoreNameToK8sName(coreName string) (string, string, error) { + idx := strings.LastIndex(coreName, ".") + if idx == -1 { + return "", "", errors.New(`name must include namespace after the dot, ex. "name.namespace"`) + } + // namespace cannot contain "." therefore it's always the last part + namespace := coreName[idx+1:] + if namespace == "" { + return "", "", errors.New("namespace must be non-empty") + } + return coreName[:idx], namespace, nil +} + +func K8sNamespacedNameToCoreName(name, namespace string) string { + return fmt.Sprintf("%s.%s", name, namespace) +} diff --git a/pkg/xds/bootstrap/generator_test.go b/pkg/xds/bootstrap/generator_test.go index 9189f0619ad5..bd488b097322 100644 --- a/pkg/xds/bootstrap/generator_test.go +++ b/pkg/xds/bootstrap/generator_test.go @@ -48,12 +48,12 @@ var _ = Describe("bootstrapGenerator", func() { } // when - err := resManager.Create(context.Background(), &mesh.MeshResource{}, store.CreateByKey("default", "mesh", "mesh")) + err := resManager.Create(context.Background(), &mesh.MeshResource{}, store.CreateByKey("mesh", "mesh")) // then Expect(err).ToNot(HaveOccurred()) // when - err = resManager.Create(context.Background(), &dataplane, store.CreateByKey("namespace", "name", "mesh")) + err = resManager.Create(context.Background(), &dataplane, store.CreateByKey("name.namespace", "mesh")) // then Expect(err).ToNot(HaveOccurred()) }) diff --git a/pkg/xds/bootstrap/server_test.go b/pkg/xds/bootstrap/server_test.go index 377fdabd453b..0267c2537b41 100644 --- a/pkg/xds/bootstrap/server_test.go +++ b/pkg/xds/bootstrap/server_test.go @@ -61,11 +61,12 @@ var _ = Describe("Bootstrap Server", func() { }) BeforeEach(func() { - err := resManager.Create(context.Background(), &mesh.MeshResource{}, store.CreateByKey("default", "default", "default")) + err := resManager.Create(context.Background(), &mesh.MeshResource{}, store.CreateByKey("default", "default")) Expect(err).ToNot(HaveOccurred()) }) type testCase struct { + dataplaneName string body string expectedConfigFile string } @@ -86,7 +87,7 @@ var _ = Describe("Bootstrap Server", func() { }, }, } - err := resManager.Create(context.Background(), &res, store.CreateByKey("default", "dp-1", "default")) + err := resManager.Create(context.Background(), &res, store.CreateByKey(given.dataplaneName, "default")) Expect(err).ToNot(HaveOccurred()) // when @@ -106,14 +107,17 @@ var _ = Describe("Bootstrap Server", func() { Expect(received).To(MatchYAML(expected)) }, Entry("minimal data provided (universal)", testCase{ + dataplaneName: "dp-1", body: `{ "mesh": "default", "name": "dp-1" }`, expectedConfigFile: "bootstrap.universal.golden.yaml", }), Entry("minimal data provided (k8s)", testCase{ + dataplaneName: "dp-1.default", body: `{ "mesh": "default", "name": "dp-1.default" }`, expectedConfigFile: "bootstrap.k8s.golden.yaml", }), Entry("full data provided", testCase{ + dataplaneName: "dp-1.default", body: `{ "mesh": "default", "name": "dp-1.default", "adminPort": 1234, "dataplaneTokenPath": "/tmp/token" }`, expectedConfigFile: "bootstrap.overridden.golden.yaml", }), diff --git a/pkg/xds/bootstrap/testdata/bootstrap.universal.golden.yaml b/pkg/xds/bootstrap/testdata/bootstrap.universal.golden.yaml index 7c34dfa46bbb..0e089cc66b38 100644 --- a/pkg/xds/bootstrap/testdata/bootstrap.universal.golden.yaml +++ b/pkg/xds/bootstrap/testdata/bootstrap.universal.golden.yaml @@ -10,7 +10,7 @@ dynamicResources: ads: {} node: cluster: backend - id: default.dp-1.default + id: default.dp-1 staticResources: clusters: - connectTimeout: 1s diff --git a/pkg/xds/envoy/envoy_test.go b/pkg/xds/envoy/envoy_test.go index 861368c97224..365aadd55084 100644 --- a/pkg/xds/envoy/envoy_test.go +++ b/pkg/xds/envoy/envoy_test.go @@ -383,9 +383,8 @@ var _ = Describe("Envoy", func() { Items: []*mesh_core.TrafficPermissionResource{ &mesh_core.TrafficPermissionResource{ Meta: &test_model.ResourceMeta{ - Name: "tp-1", - Mesh: "default", - Namespace: "default", + Name: "tp-1", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ Sources: []*mesh_proto.Selector{ @@ -489,7 +488,7 @@ var _ = Describe("Envoy", func() { '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: @@ -560,7 +559,7 @@ var _ = Describe("Envoy", func() { '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: @@ -644,9 +643,8 @@ var _ = Describe("Envoy", func() { func(given testCase) { proxy := xds.Proxy{ Id: xds.ProxyId{ - Name: "backend", - Mesh: "example", - Namespace: "sample", + Name: "backend", + Mesh: "example", }, Dataplane: &mesh_core.DataplaneResource{ Spec: mesh_proto.Dataplane{ diff --git a/pkg/xds/envoy/rbac.go b/pkg/xds/envoy/rbac.go index 78b6df467a7b..2983b4772fda 100644 --- a/pkg/xds/envoy/rbac.go +++ b/pkg/xds/envoy/rbac.go @@ -29,7 +29,7 @@ func createRbacFilter(listenerName string, permissions *mesh_core.TrafficPermiss func createRbacRule(listenerName string, permissions *mesh_core.TrafficPermissionResourceList) *rbac.RBAC { policies := make(map[string]*rbac_config.Policy, len(permissions.Items)) for _, permission := range permissions.Items { - policyName := fmt.Sprintf("%s.%s", permission.Meta.GetNamespace(), permission.Meta.GetName()) + policyName := permission.Meta.GetName() policies[policyName] = createPolicy(permission) } diff --git a/pkg/xds/generator/inbound_proxy_generator_test.go b/pkg/xds/generator/inbound_proxy_generator_test.go index 559be767557d..a7af98a64b56 100644 --- a/pkg/xds/generator/inbound_proxy_generator_test.go +++ b/pkg/xds/generator/inbound_proxy_generator_test.go @@ -45,7 +45,7 @@ var _ = Describe("InboundProxyGenerator", func() { Expect(err).ToNot(HaveOccurred()) Expect(util_proto.FromYAML(dpBytes, &dataplane)).To(Succeed()) proxy := &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "1", @@ -57,9 +57,8 @@ var _ = Describe("InboundProxyGenerator", func() { Items: []*mesh_core.TrafficPermissionResource{ { Meta: &test_model.ResourceMeta{ - Name: "tp-1", - Mesh: "default", - Namespace: "default", + Name: "tp-1", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ Sources: []*mesh_proto.Selector{ diff --git a/pkg/xds/generator/outbound_proxy_generator_test.go b/pkg/xds/generator/outbound_proxy_generator_test.go index 262196e37066..32b5edc0c97b 100644 --- a/pkg/xds/generator/outbound_proxy_generator_test.go +++ b/pkg/xds/generator/outbound_proxy_generator_test.go @@ -55,7 +55,7 @@ var _ = Describe("OutboundProxyGenerator", func() { Expect(util_proto.FromYAML([]byte(given.dataplane), &dataplane)).To(Succeed()) proxy := &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default", Mesh: "default"}, + Id: model.ProxyId{Name: "side-car", Mesh: "default"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "1", @@ -230,7 +230,7 @@ var _ = Describe("OutboundProxyGenerator", func() { Expect(util_proto.FromYAML([]byte(given.dataplane), &dataplane)).To(Succeed()) proxy := &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default", Mesh: "default"}, + Id: model.ProxyId{Name: "side-car", Mesh: "default"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "1", diff --git a/pkg/xds/generator/proxy_template_profile_source_test.go b/pkg/xds/generator/proxy_template_profile_source_test.go index 6fd2233928ba..50b5bdd6d6d8 100644 --- a/pkg/xds/generator/proxy_template_profile_source_test.go +++ b/pkg/xds/generator/proxy_template_profile_source_test.go @@ -48,7 +48,7 @@ var _ = Describe("ProxyTemplateProfileSource", func() { dataplane := mesh_proto.Dataplane{} Expect(util_proto.FromYAML([]byte(given.dataplane), &dataplane)).To(Succeed()) proxy := &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "1", diff --git a/pkg/xds/generator/proxy_template_raw_source_test.go b/pkg/xds/generator/proxy_template_raw_source_test.go index fd7e09dd40f0..d7accf12c6f0 100644 --- a/pkg/xds/generator/proxy_template_raw_source_test.go +++ b/pkg/xds/generator/proxy_template_raw_source_test.go @@ -43,7 +43,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }, Entry("should fail when `resource` field is empty", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -67,7 +67,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should fail when `resource` field is neither a YAML nor a JSON", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -90,7 +90,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should fail when `resource` field has unknown @type", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -115,7 +115,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should fail when `resource` field is a YAML without '@type' field", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -151,7 +151,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should fail when `resource` field is an invalid xDS resource", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -218,7 +218,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }, Entry("should support empty resource list", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -237,7 +237,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should support Listener resource as YAML", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -294,7 +294,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should support Cluster resource as YAML", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -349,7 +349,7 @@ var _ = Describe("ProxyTemplateRawSource", func() { }), Entry("should support Cluster resource as JSON", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", diff --git a/pkg/xds/generator/proxy_template_test.go b/pkg/xds/generator/proxy_template_test.go index 9283f48bce65..1bd935698720 100644 --- a/pkg/xds/generator/proxy_template_test.go +++ b/pkg/xds/generator/proxy_template_test.go @@ -50,7 +50,7 @@ var _ = Describe("TemplateProxyGenerator", func() { }, Entry("should fail when raw xDS resource is not valid", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -118,7 +118,7 @@ var _ = Describe("TemplateProxyGenerator", func() { dataplane := mesh_proto.Dataplane{} Expect(util_proto.FromYAML([]byte(given.dataplane), &dataplane)).To(Succeed()) proxy := &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "1", diff --git a/pkg/xds/generator/testdata/inbound-proxy/3-envoy-config.golden.yaml b/pkg/xds/generator/testdata/inbound-proxy/3-envoy-config.golden.yaml index 73e37772b8e1..eeeb3cb1e340 100644 --- a/pkg/xds/generator/testdata/inbound-proxy/3-envoy-config.golden.yaml +++ b/pkg/xds/generator/testdata/inbound-proxy/3-envoy-config.golden.yaml @@ -29,7 +29,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/generator/testdata/inbound-proxy/4-envoy-config.golden.yaml b/pkg/xds/generator/testdata/inbound-proxy/4-envoy-config.golden.yaml index 21686d215e1d..cf42aac20f63 100644 --- a/pkg/xds/generator/testdata/inbound-proxy/4-envoy-config.golden.yaml +++ b/pkg/xds/generator/testdata/inbound-proxy/4-envoy-config.golden.yaml @@ -31,7 +31,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/generator/testdata/inbound-proxy/5-envoy-config.golden.yaml b/pkg/xds/generator/testdata/inbound-proxy/5-envoy-config.golden.yaml index 92ca2f75ecc3..9e5d50f0cd3b 100644 --- a/pkg/xds/generator/testdata/inbound-proxy/5-envoy-config.golden.yaml +++ b/pkg/xds/generator/testdata/inbound-proxy/5-envoy-config.golden.yaml @@ -28,7 +28,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/generator/testdata/inbound-proxy/6-envoy-config.golden.yaml b/pkg/xds/generator/testdata/inbound-proxy/6-envoy-config.golden.yaml index 0079d97e1ae5..cfbefb89b147 100644 --- a/pkg/xds/generator/testdata/inbound-proxy/6-envoy-config.golden.yaml +++ b/pkg/xds/generator/testdata/inbound-proxy/6-envoy-config.golden.yaml @@ -30,7 +30,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/generator/testdata/inbound-proxy/7-envoy-config.golden.yaml b/pkg/xds/generator/testdata/inbound-proxy/7-envoy-config.golden.yaml index 384f9947d1b0..92df64395879 100644 --- a/pkg/xds/generator/testdata/inbound-proxy/7-envoy-config.golden.yaml +++ b/pkg/xds/generator/testdata/inbound-proxy/7-envoy-config.golden.yaml @@ -28,7 +28,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/generator/testdata/inbound-proxy/8-envoy-config.golden.yaml b/pkg/xds/generator/testdata/inbound-proxy/8-envoy-config.golden.yaml index 29cd78e0e389..6be753ff97df 100644 --- a/pkg/xds/generator/testdata/inbound-proxy/8-envoy-config.golden.yaml +++ b/pkg/xds/generator/testdata/inbound-proxy/8-envoy-config.golden.yaml @@ -30,7 +30,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/generator/transparent_proxy_generator_test.go b/pkg/xds/generator/transparent_proxy_generator_test.go index d658afba8624..3e2def9f85f7 100644 --- a/pkg/xds/generator/transparent_proxy_generator_test.go +++ b/pkg/xds/generator/transparent_proxy_generator_test.go @@ -43,7 +43,7 @@ var _ = Describe("TransparentProxyGenerator", func() { }, Entry("transparent_proxying=false", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", @@ -56,7 +56,7 @@ var _ = Describe("TransparentProxyGenerator", func() { }), Entry("transparent_proxying=true", testCase{ proxy: &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "v1", diff --git a/pkg/xds/server/components_test.go b/pkg/xds/server/components_test.go index 6b267cf3b9c2..556fcefbe9d7 100644 --- a/pkg/xds/server/components_test.go +++ b/pkg/xds/server/components_test.go @@ -56,7 +56,7 @@ var _ = Describe("Components", func() { Expect(err).ToNot(HaveOccurred()) // and example mesh - opts := core_store.CreateByKey("demo", "pilot", "pilot") + opts := core_store.CreateByKey("pilot", "pilot") err = runtime.ResourceManager().Create(context.Background(), &mesh_core.MeshResource{}, opts) Expect(err).ToNot(HaveOccurred()) @@ -73,7 +73,7 @@ var _ = Describe("Components", func() { typ := "" req := &envoy.DiscoveryRequest{ Node: &envoy_core.Node{ - Id: "pilot.example.demo", + Id: "pilot.example", }, } @@ -93,7 +93,7 @@ var _ = Describe("Components", func() { // when nextEvent := <-reconciler.events // then - Expect(nextEvent.Delete).To(Equal(core_model.ResourceKey{Mesh: "pilot", Namespace: "demo", Name: "example"})) + Expect(nextEvent.Delete).To(Equal(core_model.ResourceKey{Mesh: "pilot", Name: "example"})) By("creating Dataplane definition") // when @@ -111,7 +111,7 @@ var _ = Describe("Components", func() { }, }, } - err = runtime.ResourceManager().Create(ctx, resource, core_store.CreateBy(core_model.ResourceKey{Mesh: "pilot", Namespace: "demo", Name: "example"})) + err = runtime.ResourceManager().Create(ctx, resource, core_store.CreateBy(core_model.ResourceKey{Mesh: "pilot", Name: "example"})) // then Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/xds/server/dataplane_status_sink_test.go b/pkg/xds/server/dataplane_status_sink_test.go index 888f829f00ef..068650a3b19a 100644 --- a/pkg/xds/server/dataplane_status_sink_test.go +++ b/pkg/xds/server/dataplane_status_sink_test.go @@ -42,7 +42,7 @@ var _ = Describe("DataplaneInsightSink", func() { It("should periodically flush DataplaneInsight into a store", func() { // setup - key := core_model.ResourceKey{Mesh: "default", Namespace: "demo", Name: "example-001"} + key := core_model.ResourceKey{Mesh: "default", Name: "example-001"} subscription := &mesh_proto.DiscoverySubscription{ Id: "3287995C-7E11-41FB-9479-7D39337F845D", ControlPlaneInstanceId: "control-plane-01", @@ -135,13 +135,13 @@ var _ = Describe("DataplaneInsightSink", func() { BeforeEach(func() { store = memory_resources.NewStore() - err := store.Create(context.Background(), &mesh_core.MeshResource{}, core_store.CreateByKey("default", "default", "default")) + err := store.Create(context.Background(), &mesh_core.MeshResource{}, core_store.CreateByKey("default", "default")) Expect(err).ToNot(HaveOccurred()) }) It("should create/update DataplaneInsight resource", func() { // setup - key := core_model.ResourceKey{Mesh: "default", Namespace: "demo", Name: "example-001"} + key := core_model.ResourceKey{Mesh: "default", Name: "example-001"} subscription := &mesh_proto.DiscoverySubscription{ Id: "3287995C-7E11-41FB-9479-7D39337F845D", ControlPlaneInstanceId: "control-plane-01", diff --git a/pkg/xds/server/dataplane_status_tracker.go b/pkg/xds/server/dataplane_status_tracker.go index cfb197018013..78ab0eff1167 100644 --- a/pkg/xds/server/dataplane_status_tracker.go +++ b/pkg/xds/server/dataplane_status_tracker.go @@ -120,7 +120,7 @@ func (c *dataplaneStatusTracker) OnStreamRequest(streamID int64, req *envoy.Disc // infer Dataplane id if state.dataplaneId == (core_model.ResourceKey{}) { if id, err := core_xds.ParseProxyId(req.Node); err == nil { - state.dataplaneId = core_model.ResourceKey{Mesh: id.Mesh, Namespace: id.Namespace, Name: id.Name} + state.dataplaneId = core_model.ResourceKey{Mesh: id.Mesh, Name: id.Name} // kick off async Dataplane status flusher go c.createStatusSink(state).Start(state.stop) } else { diff --git a/pkg/xds/server/dataplane_status_tracker_test.go b/pkg/xds/server/dataplane_status_tracker_test.go index 8719dab376e0..67b2deeb0c53 100644 --- a/pkg/xds/server/dataplane_status_tracker_test.go +++ b/pkg/xds/server/dataplane_status_tracker_test.go @@ -184,7 +184,7 @@ var _ = Describe("DataplaneStatusTracker", func() { // when discoveryRequest := &envoy.DiscoveryRequest{ Node: &envoy_core.Node{ - Id: "default.example-001.demo", + Id: "default.example-001", }, TypeUrl: given.TypeUrl, } @@ -197,9 +197,8 @@ var _ = Describe("DataplaneStatusTracker", func() { key, subscription := accessor.GetStatus() // then Expect(key).To(Equal(core_model.ResourceKey{ - Mesh: "default", - Namespace: "demo", - Name: "example-001", + Mesh: "default", + Name: "example-001", })) Expect(util_proto.ToYAML(subscription)).To(MatchYAML(` connectTime: "2019-07-01T00:00:00Z" @@ -224,9 +223,8 @@ var _ = Describe("DataplaneStatusTracker", func() { key, subscription = accessor.GetStatus() // then Expect(key).To(Equal(core_model.ResourceKey{ - Mesh: "default", - Namespace: "demo", - Name: "example-001", + Mesh: "default", + Name: "example-001", })) Expect(util_proto.ToYAML(subscription)).To(MatchYAML(given.ExpectedStatsAfterResponse)) @@ -245,9 +243,8 @@ var _ = Describe("DataplaneStatusTracker", func() { key, subscription = accessor.GetStatus() // then Expect(key).To(Equal(core_model.ResourceKey{ - Mesh: "default", - Namespace: "demo", - Name: "example-001", + Mesh: "default", + Name: "example-001", })) Expect(util_proto.ToYAML(subscription)).To(MatchYAML(given.ExpectedStatsAfterACK)) @@ -269,9 +266,8 @@ var _ = Describe("DataplaneStatusTracker", func() { key, subscription = accessor.GetStatus() // then Expect(key).To(Equal(core_model.ResourceKey{ - Mesh: "default", - Namespace: "demo", - Name: "example-001", + Mesh: "default", + Name: "example-001", })) Expect(util_proto.ToYAML(subscription)).To(MatchYAML(given.ExpectedStatsAfterNACK)) }, diff --git a/pkg/xds/server/proxy_template_resolver.go b/pkg/xds/server/proxy_template_resolver.go index 8afbf972f003..12a33de24382 100644 --- a/pkg/xds/server/proxy_template_resolver.go +++ b/pkg/xds/server/proxy_template_resolver.go @@ -46,10 +46,10 @@ func (r *simpleProxyTemplateResolver) GetTemplate(proxy *model.Proxy) *mesh_prot // Every matching ProxyTemplate gets a rank (score) defined as a maximum number of tags in a matching selector. // ProxyTemplate with an empty list of selectors is considered a match with a rank (score) of 0. // ProxyTemplate with an empty selector (one that has no tags) is considered a match with a rank (score) of 0. -// In case if there are multiple ProxyTemplates with the same rank (score), templates are sorted alphabetically by Namespace and Name +// In case if there are multiple ProxyTemplates with the same rank (score), templates are sorted alphabetically by Name // and the first one is considered the "best match". func FindBestMatch(proxy *model.Proxy, templates []*mesh_core.ProxyTemplateResource) *mesh_core.ProxyTemplateResource { - sort.Stable(ProxyTemplatesByNamespacedName(templates)) // sort to avoid flakiness + sort.Stable(ProxyTemplatesByName(templates)) // sort to avoid flakiness var bestMatch *mesh_core.ProxyTemplateResource var bestScore int @@ -87,11 +87,10 @@ func ScoreMatch(selector map[string]string, target map[string]string) (bool, int return true, len(selector) } -type ProxyTemplatesByNamespacedName []*mesh_core.ProxyTemplateResource +type ProxyTemplatesByName []*mesh_core.ProxyTemplateResource -func (a ProxyTemplatesByNamespacedName) Len() int { return len(a) } -func (a ProxyTemplatesByNamespacedName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a ProxyTemplatesByNamespacedName) Less(i, j int) bool { - return a[i].Meta.GetNamespace() < a[j].Meta.GetNamespace() || - (a[i].Meta.GetNamespace() == a[j].Meta.GetNamespace() && a[i].Meta.GetName() < a[j].Meta.GetName()) +func (a ProxyTemplatesByName) Len() int { return len(a) } +func (a ProxyTemplatesByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a ProxyTemplatesByName) Less(i, j int) bool { + return a[i].Meta.GetName() < a[j].Meta.GetName() } diff --git a/pkg/xds/server/proxy_template_resolver_test.go b/pkg/xds/server/proxy_template_resolver_test.go index 40ec7a511dd8..82551a5c461f 100644 --- a/pkg/xds/server/proxy_template_resolver_test.go +++ b/pkg/xds/server/proxy_template_resolver_test.go @@ -67,9 +67,8 @@ var _ = Describe("Reconcile", func() { expected := &mesh_core.ProxyTemplateResource{ Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "expected", + Mesh: "pilot", + Name: "expected", }, Spec: mesh_proto.ProxyTemplate{ Conf: &mesh_proto.ProxyTemplate_Conf{ @@ -80,9 +79,8 @@ var _ = Describe("Reconcile", func() { other := &mesh_core.ProxyTemplateResource{ Meta: &test_model.ResourceMeta{ - Mesh: "default", - Namespace: "default", - Name: "other", + Mesh: "default", + Name: "other", }, Spec: mesh_proto.ProxyTemplate{ Conf: &mesh_proto.ProxyTemplate_Conf{ @@ -94,7 +92,7 @@ var _ = Describe("Reconcile", func() { // setup memStore := memory.NewStore() for _, template := range []*mesh_core.ProxyTemplateResource{expected, other} { - err := memStore.Create(context.Background(), template, store.CreateByKey(template.Meta.GetNamespace(), template.Meta.GetName(), template.Meta.GetMesh())) + err := memStore.Create(context.Background(), template, store.CreateByKey(template.Meta.GetName(), template.Meta.GetMesh())) Expect(err).ToNot(HaveOccurred()) } @@ -139,84 +137,46 @@ var _ = Describe("Reconcile", func() { }) - Describe("ProxyTemplatesByNamespacedName", func() { + Describe("ProxyTemplatesByName", func() { type testCase struct { input []*mesh_core.ProxyTemplateResource expected []*mesh_core.ProxyTemplateResource } - DescribeTable("should sort ProxyTemplates by Namespace and Name", + DescribeTable("should sort ProxyTemplates by Name", func(given testCase) { // when - sort.Stable(ProxyTemplatesByNamespacedName(given.input)) + sort.Stable(ProxyTemplatesByName(given.input)) // then Expect(given.input).To(ConsistOf(given.expected)) }, - Entry("ProxyTemplates in the same Namespace", testCase{ + Entry("ProxyTemplates in the same mesh", testCase{ input: []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "last", + Mesh: "pilot", + Name: "last", }, }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, }, }, expected: []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "last", - }, - }, - }, - }), - Entry("ProxyTemplates in different Namespaces", testCase{ - input: []*mesh_core.ProxyTemplateResource{ - { - Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "pilot", - Name: "a", - }, - }, - { - Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "b", - }, - }, - }, - expected: []*mesh_core.ProxyTemplateResource{ - { - Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "b", - }, - }, - { - Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "pilot", - Name: "a", + Mesh: "pilot", + Name: "last", }, }, }, @@ -330,24 +290,21 @@ var _ = Describe("Reconcile", func() { templates: []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "last", + Mesh: "pilot", + Name: "last", }, }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, }, }, expected: &mesh_core.ProxyTemplateResource{ Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, }, }), @@ -356,9 +313,8 @@ var _ = Describe("Reconcile", func() { templates: []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "last", + Mesh: "pilot", + Name: "last", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ @@ -368,9 +324,8 @@ var _ = Describe("Reconcile", func() { }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ @@ -381,9 +336,8 @@ var _ = Describe("Reconcile", func() { }, expected: &mesh_core.ProxyTemplateResource{ Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ @@ -418,9 +372,8 @@ var _ = Describe("Reconcile", func() { templates: []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "last", + Mesh: "pilot", + Name: "last", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ @@ -435,9 +388,8 @@ var _ = Describe("Reconcile", func() { }, { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ @@ -459,9 +411,8 @@ var _ = Describe("Reconcile", func() { }, expected: &mesh_core.ProxyTemplateResource{ Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "first", + Mesh: "pilot", + Name: "first", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ @@ -486,9 +437,8 @@ var _ = Describe("Reconcile", func() { templates: []*mesh_core.ProxyTemplateResource{ { Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "default", - Name: "last", + Mesh: "pilot", + Name: "last", }, Spec: mesh_proto.ProxyTemplate{ Selectors: []*mesh_proto.Selector{ diff --git a/pkg/xds/server/reconcile_test.go b/pkg/xds/server/reconcile_test.go index f424b23894dc..3dfd45a9cc6c 100644 --- a/pkg/xds/server/reconcile_test.go +++ b/pkg/xds/server/reconcile_test.go @@ -90,10 +90,9 @@ var _ = Describe("Reconcile", func() { // given dataplane := &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ - Mesh: "pilot", - Namespace: "example", - Name: "demo", - Version: "abcdefg", + Mesh: "pilot", + Name: "demo", + Version: "abcdefg", }, } @@ -101,9 +100,8 @@ var _ = Describe("Reconcile", func() { // when proxy := &xds_model.Proxy{ Id: xds_model.ProxyId{ - Mesh: "pilot", - Namespace: "example", - Name: "demo", + Mesh: "pilot", + Name: "demo", }, Dataplane: dataplane, } @@ -113,7 +111,7 @@ var _ = Describe("Reconcile", func() { By("verifying that snapshot versions were auto-generated") // when - snapshot, err := xdsContext.Cache().GetSnapshot("pilot.demo.example") + snapshot, err := xdsContext.Cache().GetSnapshot("pilot.demo") // then Expect(err).ToNot(HaveOccurred()) Expect(snapshot).ToNot(BeZero()) @@ -132,7 +130,7 @@ var _ = Describe("Reconcile", func() { By("verifying that snapshot versions remain the same") // when - snapshot, err = xdsContext.Cache().GetSnapshot("pilot.demo.example") + snapshot, err = xdsContext.Cache().GetSnapshot("pilot.demo") // then Expect(err).ToNot(HaveOccurred()) Expect(snapshot).ToNot(BeZero()) @@ -151,7 +149,7 @@ var _ = Describe("Reconcile", func() { By("verifying that snapshot versions are new") // when - snapshot, err = xdsContext.Cache().GetSnapshot("pilot.demo.example") + snapshot, err = xdsContext.Cache().GetSnapshot("pilot.demo") // then Expect(err).ToNot(HaveOccurred()) Expect(snapshot).ToNot(BeZero()) diff --git a/pkg/xds/server/snapshot_generator_test.go b/pkg/xds/server/snapshot_generator_test.go index 049a89c6581a..1533d5625c69 100644 --- a/pkg/xds/server/snapshot_generator_test.go +++ b/pkg/xds/server/snapshot_generator_test.go @@ -50,7 +50,7 @@ var _ = Describe("Reconcile", func() { Expect(util_proto.FromYAML(dpBytes, &dataplane)).To(Succeed()) proxy := &model.Proxy{ - Id: model.ProxyId{Name: "side-car", Namespace: "default"}, + Id: model.ProxyId{Name: "side-car"}, Dataplane: &mesh_core.DataplaneResource{ Meta: &test_model.ResourceMeta{ Version: "1", @@ -62,9 +62,8 @@ var _ = Describe("Reconcile", func() { Items: []*mesh_core.TrafficPermissionResource{ &mesh_core.TrafficPermissionResource{ Meta: &test_model.ResourceMeta{ - Name: "tp-1", - Mesh: "default", - Namespace: "default", + Name: "tp-1", + Mesh: "default", }, Spec: mesh_proto.TrafficPermission{ Sources: []*mesh_proto.Selector{ diff --git a/pkg/xds/server/testdata/envoy-config.golden.yaml b/pkg/xds/server/testdata/envoy-config.golden.yaml index c52663febb4e..aec1efce728d 100644 --- a/pkg/xds/server/testdata/envoy-config.golden.yaml +++ b/pkg/xds/server/testdata/envoy-config.golden.yaml @@ -119,7 +119,7 @@ resources: '@type': type.googleapis.com/envoy.config.filter.network.rbac.v2.RBAC rules: policies: - default.tp-1: + tp-1: permissions: - any: true principals: diff --git a/pkg/xds/sync/dataplane_sync_tracker.go b/pkg/xds/sync/dataplane_sync_tracker.go index bc021aace671..3c946cba5f9e 100644 --- a/pkg/xds/sync/dataplane_sync_tracker.go +++ b/pkg/xds/sync/dataplane_sync_tracker.go @@ -68,7 +68,7 @@ func (t *dataplaneSyncTracker) OnStreamRequest(streamID int64, req *envoy.Discov defer t.mu.Unlock() if id, err := core_xds.ParseProxyId(req.Node); err == nil { - dataplaneKey := core_model.ResourceKey{Mesh: id.Mesh, Namespace: id.Namespace, Name: id.Name} + dataplaneKey := core_model.ResourceKey{Mesh: id.Mesh, Name: id.Name} // kick off watchdag for that Dataplane stopCh := make(chan struct{}) diff --git a/pkg/xds/sync/dataplane_sync_tracker_test.go b/pkg/xds/sync/dataplane_sync_tracker_test.go index 0a364efd5384..8cc355b1912a 100644 --- a/pkg/xds/sync/dataplane_sync_tracker_test.go +++ b/pkg/xds/sync/dataplane_sync_tracker_test.go @@ -88,7 +88,7 @@ var _ = Describe("Sync", func() { typ := "" req := &envoy.DiscoveryRequest{ Node: &envoy_core.Node{ - Id: "pilot.example.demo", + Id: "pilot.example", }, } @@ -108,7 +108,7 @@ var _ = Describe("Sync", func() { // when dataplaneID := <-watchdogCh // then - Expect(dataplaneID).To(Equal(core_model.ResourceKey{Mesh: "pilot", Namespace: "demo", Name: "example"})) + Expect(dataplaneID).To(Equal(core_model.ResourceKey{Mesh: "pilot", Name: "example"})) By("simulating another DiscoveryRequest") // when diff --git a/pkg/xds/topology/router.go b/pkg/xds/topology/router.go index ffa369659d41..92e4a154f89c 100644 --- a/pkg/xds/topology/router.go +++ b/pkg/xds/topology/router.go @@ -18,9 +18,6 @@ type pseudoMeta struct { func (m *pseudoMeta) GetMesh() string { return "" } -func (m *pseudoMeta) GetNamespace() string { - return "" -} func (m *pseudoMeta) GetName() string { return m.Name } @@ -42,7 +39,7 @@ func GetRoutes(ctx context.Context, dataplane *mesh_core.DataplaneResource, mana // BuildRouteMap picks a single the most specific route for each outbound interface of a given Dataplane. func BuildRouteMap(dataplane *mesh_core.DataplaneResource, routes []*mesh_core.TrafficRouteResource) core_xds.RouteMap { - sort.Stable(TrafficRoutesByNamespacedName(routes)) // sort to avoid flakiness + sort.Stable(TrafficRoutesByName(routes)) // sort to avoid flakiness // First, select only those TrafficRoutes that have a `source` selector matching a given Dataplane. // If a TrafficRoute has multiple matching `source` selectors, we need to choose the most specific one. @@ -164,11 +161,10 @@ func BuildDestinationMap(dataplane *mesh_core.DataplaneResource, routes core_xds return destinations } -type TrafficRoutesByNamespacedName []*mesh_core.TrafficRouteResource +type TrafficRoutesByName []*mesh_core.TrafficRouteResource -func (a TrafficRoutesByNamespacedName) Len() int { return len(a) } -func (a TrafficRoutesByNamespacedName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a TrafficRoutesByNamespacedName) Less(i, j int) bool { - return a[i].Meta.GetNamespace() < a[j].Meta.GetNamespace() || - (a[i].Meta.GetNamespace() == a[j].Meta.GetNamespace() && a[i].Meta.GetName() < a[j].Meta.GetName()) +func (a TrafficRoutesByName) Len() int { return len(a) } +func (a TrafficRoutesByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a TrafficRoutesByName) Less(i, j int) bool { + return a[i].Meta.GetName() < a[j].Meta.GetName() } diff --git a/pkg/xds/topology/router_test.go b/pkg/xds/topology/router_test.go index f637836aff20..fbeab2a09031 100644 --- a/pkg/xds/topology/router_test.go +++ b/pkg/xds/topology/router_test.go @@ -146,7 +146,6 @@ var _ = Describe("TrafficRoute", func() { sameMeta := func(meta1, meta2 core_model.ResourceMeta) bool { return meta1.GetMesh() == meta2.GetMesh() && meta1.GetName() == meta2.GetName() && - meta1.GetNamespace() == meta2.GetNamespace() && meta1.GetVersion() == meta2.GetVersion() } type testCase struct { @@ -270,8 +269,7 @@ var _ = Describe("TrafficRoute", func() { routes: []*mesh_core.TrafficRouteResource{ { Meta: &test_model.ResourceMeta{ - Name: "everything-to-elastic-v1", - Namespace: "some", + Name: "everything-to-elastic-v1", }, Spec: mesh_proto.TrafficRoute{ Sources: []*mesh_proto.Selector{ @@ -309,72 +307,7 @@ var _ = Describe("TrafficRoute", func() { }, "elastic": &mesh_core.TrafficRouteResource{ Meta: &test_model.ResourceMeta{ - Name: "everything-to-elastic-v1", - Namespace: "some", - }, - }, - }, - }), - Entry("TrafficRoutes should be ordered by namespace to consistently pick between two equally specific routes", testCase{ - dataplane: &mesh_core.DataplaneResource{ - Spec: mesh_proto.Dataplane{ - Networking: &mesh_proto.Dataplane_Networking{ - Inbound: []*mesh_proto.Dataplane_Networking_Inbound{ - {Tags: map[string]string{"service": "backend"}}, - }, - Outbound: []*mesh_proto.Dataplane_Networking_Outbound{ - {Service: "redis"}, - }, - }, - }, - }, - routes: []*mesh_core.TrafficRouteResource{ - { - Meta: &test_model.ResourceMeta{ - Name: "everything-to-blackhole", // although name `everything-to-blackhole` precedes `everything-to-hollygrail` lexicographically, namespace value is considered first - Namespace: "order-2", - }, - Spec: mesh_proto.TrafficRoute{ - Sources: []*mesh_proto.Selector{ - {Match: mesh_proto.TagSelector{"service": "*"}}, - }, - Destinations: []*mesh_proto.Selector{ - {Match: mesh_proto.TagSelector{"service": "*"}}, - }, - Conf: []*mesh_proto.TrafficRoute_WeightedDestination{ - { - Weight: 100, - Destination: mesh_proto.TagSelector{"service": "blackhole"}, - }, - }, - }, - }, - { - Meta: &test_model.ResourceMeta{ - Name: "everything-to-hollygrail", - Namespace: "order-1", - }, - Spec: mesh_proto.TrafficRoute{ - Sources: []*mesh_proto.Selector{ - {Match: mesh_proto.TagSelector{"service": "*"}}, - }, - Destinations: []*mesh_proto.Selector{ - {Match: mesh_proto.TagSelector{"service": "*"}}, - }, - Conf: []*mesh_proto.TrafficRoute_WeightedDestination{ - { - Weight: 100, - Destination: mesh_proto.TagSelector{"service": "hollygrail"}, - }, - }, - }, - }, - }, - expected: core_xds.RouteMap{ - "redis": &mesh_core.TrafficRouteResource{ - Meta: &test_model.ResourceMeta{ - Name: "everything-to-hollygrail", - Namespace: "order-1", + Name: "everything-to-elastic-v1", }, }, }, @@ -395,8 +328,7 @@ var _ = Describe("TrafficRoute", func() { routes: []*mesh_core.TrafficRouteResource{ { Meta: &test_model.ResourceMeta{ - Name: "everything-to-hollygrail", - Namespace: "default", + Name: "everything-to-hollygrail", }, Spec: mesh_proto.TrafficRoute{ Sources: []*mesh_proto.Selector{ @@ -415,8 +347,7 @@ var _ = Describe("TrafficRoute", func() { }, { Meta: &test_model.ResourceMeta{ - Name: "everything-to-blackhole", - Namespace: "default", + Name: "everything-to-blackhole", }, Spec: mesh_proto.TrafficRoute{ Sources: []*mesh_proto.Selector{ @@ -437,8 +368,7 @@ var _ = Describe("TrafficRoute", func() { expected: core_xds.RouteMap{ "redis": &mesh_core.TrafficRouteResource{ Meta: &test_model.ResourceMeta{ - Name: "everything-to-blackhole", - Namespace: "default", + Name: "everything-to-blackhole", }, }, },