diff --git a/api/v2beta1/wfs_conversion.go b/api/v2beta1/wfs_conversion.go index 92d7e15..d895fb9 100644 --- a/api/v2beta1/wfs_conversion.go +++ b/api/v2beta1/wfs_conversion.go @@ -40,6 +40,10 @@ func (src *WFS) ConvertTo(dstRaw conversion.Hub) error { log.Printf("ConvertTo: Converting WFS from Spoke version v2beta1 to Hub version v3;"+ "source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name) + return src.ToV3(dst) +} + +func (src *WFS) ToV3(dst *pdoknlv3.WFS) error { dst.ObjectMeta = src.ObjectMeta // Set LifeCycle if defined diff --git a/api/v2beta1/wms_conversion.go b/api/v2beta1/wms_conversion.go index 08acd5e..46cfb0b 100644 --- a/api/v2beta1/wms_conversion.go +++ b/api/v2beta1/wms_conversion.go @@ -43,12 +43,12 @@ func (src *WMS) ConvertTo(dstRaw conversion.Hub) error { dst := dstRaw.(*pdoknlv3.WMS) log.Printf("ConvertTo: Converting WMS from Spoke version v2beta1 to Hub version v3;"+ "source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name) - V3HubFromV2(src, dst) + src.ToV3(dst) return nil } -func V3HubFromV2(src *WMS, target *pdoknlv3.WMS) { +func (src *WMS) ToV3(target *pdoknlv3.WMS) { dst := target dst.ObjectMeta = src.ObjectMeta @@ -319,7 +319,7 @@ func (v2Service WMSService) MapLayersToV3() pdoknlv3.Layer { Title: &v2Service.Title, Abstract: &v2Service.Abstract, Keywords: v2Service.Keywords, - Layers: &[]pdoknlv3.Layer{}, + Layers: []pdoknlv3.Layer{}, BoundingBoxes: boundingBoxes, Visible: smoothoperatorutils.Pointer(true), } @@ -327,7 +327,7 @@ func (v2Service WMSService) MapLayersToV3() pdoknlv3.Layer { // adding the bottom layers to the middle layers they are grouped by for _, layer := range notGroupedLayers { bottomLayers := groupedLayers[*layer.Name] - layer.Layers = &bottomLayers + layer.Layers = bottomLayers middleLayers = append(middleLayers, layer) } } @@ -339,11 +339,11 @@ func (v2Service WMSService) MapLayersToV3() pdoknlv3.Layer { if topLayer.Name != nil { for _, layer := range groupedLayers[*topLayer.Name] { bottomLayers := groupedLayers[*layer.Name] - layer.Layers = &bottomLayers + layer.Layers = bottomLayers middleLayers = append(middleLayers, layer) } } - topLayer.Layers = &middleLayers + topLayer.Layers = middleLayers return *topLayer } @@ -356,7 +356,7 @@ func (v2Layer WMSLayer) MapToV3(v2Service WMSService) pdoknlv3.Layer { Keywords: v2Layer.Keywords, LabelNoClip: v2Layer.LabelNoClip, Styles: []pdoknlv3.Style{}, - Layers: &[]pdoknlv3.Layer{}, + Layers: []pdoknlv3.Layer{}, BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, MinScaleDenominator: nil, MaxScaleDenominator: nil, @@ -429,7 +429,7 @@ func mapV3LayerToV2Layers(v3Layer pdoknlv3.Layer, parent *pdoknlv3.Layer, servic if parent == nil && v3Layer.Name == nil { // Default top layer, do not include in v2 layers if v3Layer.Layers != nil { - for _, childLayer := range *v3Layer.Layers { + for _, childLayer := range v3Layer.Layers { layers = append(layers, mapV3LayerToV2Layers(childLayer, nil, serviceEPSG)...) } } @@ -503,7 +503,7 @@ func mapV3LayerToV2Layers(v3Layer pdoknlv3.Layer, parent *pdoknlv3.Layer, servic layers = append(layers, v2Layer) if v3Layer.Layers != nil { - for _, childLayer := range *v3Layer.Layers { + for _, childLayer := range v3Layer.Layers { layers = append(layers, mapV3LayerToV2Layers(childLayer, &v3Layer, serviceEPSG)...) } } diff --git a/api/v2beta1/wms_conversion_test.go b/api/v2beta1/wms_conversion_test.go index d184e37..cc0dfb4 100644 --- a/api/v2beta1/wms_conversion_test.go +++ b/api/v2beta1/wms_conversion_test.go @@ -10,11 +10,11 @@ import ( func TestV2ToV3(t *testing.T) { //nolint:misspell input := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: rws-nwbwegen-v1-0\n labels:\n dataset-owner: rws\n dataset: nwbwegen\n service-version: v1_0\n service-type: wms\n annotations:\n lifecycle-phase: prod\n service-bundle-id: b39c152b-393b-52f5-a50c-e1ffe904b6fb\nspec:\n general:\n datasetOwner: rws\n dataset: nwbwegen\n serviceVersion: v1_0\n kubernetes:\n healthCheck:\n boundingbox: 135134.89,457152.55,135416.03,457187.82\n resources:\n limits:\n ephemeralStorage: 1535Mi\n memory: 4G\n requests:\n cpu: 2000m\n ephemeralStorage: 1535Mi\n memory: 4G\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n service:\n title: NWB - Wegen WMS\n abstract:\n Dit is de web map service van het Nationaal Wegen Bestand (NWB) - wegen.\n Deze dataset bevat alleen de wegvakken en hectometerpunten. Het Nationaal Wegen\n Bestand - Wegen is een digitaal geografisch bestand van alle wegen in Nederland.\n Opgenomen zijn alle wegen die worden beheerd door wegbeheerders als het Rijk,\n provincies, gemeenten en waterschappen, echter alleen voor zover deze zijn voorzien\n van een straatnaam of nummer.\n authority:\n name: rws\n url: https://www.rijkswaterstaat.nl\n dataEPSG: EPSG:28992\n extent: -59188.44333693248 304984.64144318487 308126.88473339565 858328.516489961\n inspire: true\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n - Hectometerpunten\n - HVD\n - Mobiliteit\n stylingAssets:\n configMapRefs:\n - name: includes\n keys:\n - nwb_wegen_hectopunten.symbol\n - hectopunten.style\n - wegvakken.style\n blobKeys:\n - resources/fonts/liberation-sans.ttf\n layers:\n - abstract:\n Deze laag bevat de wegvakken uit het Nationaal Wegen bestand (NWB)\n en geeft gedetailleerde informatie per wegvak zoals straatnaam, wegnummer,\n routenummer, wegbeheerder, huisnummers, enz. weer.\n data:\n gpkg:\n columns:\n - objectid\n - wvk_id\n - wvk_begdat\n - jte_id_beg\n - jte_id_end\n - wegbehsrt\n - wegnummer\n - wegdeelltr\n - hecto_lttr\n - bst_code\n - rpe_code\n - admrichtng\n - rijrichtng\n - stt_naam\n - stt_bron\n - wpsnaam\n - gme_id\n - gme_naam\n - hnrstrlnks\n - hnrstrrhts\n - e_hnr_lnks\n - e_hnr_rhts\n - l_hnr_lnks\n - l_hnr_rhts\n - begafstand\n - endafstand\n - beginkm\n - eindkm\n - pos_tv_wol\n - wegbehcode\n - wegbehnaam\n - distrcode\n - distrnaam\n - dienstcode\n - dienstnaam\n - wegtype\n - wgtype_oms\n - routeltr\n - routenr\n - routeltr2\n - routenr2\n - routeltr3\n - routenr3\n - routeltr4\n - routenr4\n - wegnr_aw\n - wegnr_hmp\n - geobron_id\n - geobron_nm\n - bronjaar\n - openlr\n - bag_orl\n - frc\n - fow\n - alt_naam\n - alt_nr\n - rel_hoogte\n - st_lengthshape\n geometryType: MultiLineString\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: wegvakken\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n maxScale: 50000.0\n minScale: 1.0\n name: wegvakken\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: wegvakken\n title: NWB - Wegvakken\n visualization: wegvakken.style\n title: Wegvakken\n visible: true\n - abstract:\n Deze laag bevat de hectopunten uit het Nationaal Wegen Bestand (NWB)\n en geeft gedetailleerde informatie per hectopunt zoals hectometrering, afstand,\n zijde en hectoletter weer.\n data:\n gpkg:\n columns:\n - objectid\n - hectomtrng\n - afstand\n - wvk_id\n - wvk_begdat\n - zijde\n - hecto_lttr\n geometryType: MultiPoint\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: hectopunten\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Hectometerpunten\n maxScale: 50000.0\n minScale: 1.0\n name: hectopunten\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: hectopunten\n title: NWB - Hectopunten\n visualization: hectopunten.style\n title: Hectopunten\n visible: true\n metadataIdentifier: f2437a92-ddd3-4777-a1bc-fdf4b4a7fcb8\n" - var v2wms WMS - err := yaml.Unmarshal([]byte(input), &v2wms) + v2wms := &WMS{} + err := yaml.Unmarshal([]byte(input), v2wms) assert.NoError(t, err) var target pdoknlv3.WMS - V3HubFromV2(&v2wms, &target) + v2wms.ToV3(&target) assert.Equal(t, "NWB - Wegen WMS", target.Spec.Service.Title) a := 0 _ = a diff --git a/api/v3/wfs_types.go b/api/v3/wfs_types.go index 24f7328..90c47f1 100644 --- a/api/v3/wfs_types.go +++ b/api/v3/wfs_types.go @@ -120,6 +120,7 @@ type WFSService struct { // AccessConstraints URL // +kubebuilder:validation:Pattern:="https?://" // +kubebuilder:default="https://creativecommons.org/publicdomain/zero/1.0/deed.nl" + // +kubebuilder:validation:MinLength:=1 AccessConstraints string `json:"accessConstraints"` diff --git a/api/v3/wfs_validation.go b/api/v3/wfs_validation.go index 48e14be..4f07504 100644 --- a/api/v3/wfs_validation.go +++ b/api/v3/wfs_validation.go @@ -16,7 +16,7 @@ func (wfs *WFS) ValidateCreate() ([]string, error) { reasons = append(reasons, fmt.Sprintf("%v", err)) } - validateWFS(wfs, &warnings, &reasons) + ValidateWFS(wfs, &warnings, &reasons) if len(reasons) > 0 { return warnings, fmt.Errorf("%s", strings.Join(reasons, ". ")) @@ -41,7 +41,7 @@ func (wfs *WFS) ValidateUpdate(wfsOld *WFS) ([]string, error) { reasons = append(reasons, "services cannot change from inspire to not inspire or the other way around") } - validateWFS(wfs, &warnings, &reasons) + ValidateWFS(wfs, &warnings, &reasons) if len(reasons) > 0 { return warnings, fmt.Errorf("%s", strings.Join(reasons, ". ")) @@ -50,7 +50,7 @@ func (wfs *WFS) ValidateUpdate(wfsOld *WFS) ([]string, error) { return warnings, nil } -func validateWFS(wfs *WFS, warnings *[]string, reasons *[]string) { +func ValidateWFS(wfs *WFS, warnings *[]string, reasons *[]string) { if strings.Contains(wfs.GetName(), "wfs") { *warnings = append(*warnings, sharedValidation.FormatValidationWarning("name should not contain wfs", wfs.GroupVersionKind(), wfs.GetName())) } diff --git a/api/v3/wms_types.go b/api/v3/wms_types.go index 2c128b0..60f4721 100644 --- a/api/v3/wms_types.go +++ b/api/v3/wms_types.go @@ -90,8 +90,9 @@ type WMSService struct { Fees *string `json:"fees,omitempty"` // AccessConstraints (licence) that are applicable to the service + // +kubebuilder:validation:Pattern:=`https?://.*` // +kubebuilder:default="https://creativecommons.org/publicdomain/zero/1.0/deed.nl" - AccessConstraints string `json:"accessConstraints"` + AccessConstraints string `json:"accessConstraints,omitempty"` // TODO?? MaxSize *int32 `json:"maxSize,omitempty"` @@ -137,7 +138,7 @@ type ConfigMapRef struct { Keys []string `json:"keys,omitempty"` } -// +kubebuilder:validation:XValidation:message="A layer can only have data or layers, not both.", rule="has(self.data) || has(self.layers)" +// +kubebuilder:validation:XValidation:message="A layer should have sublayers or data, not both", rule="(has(self.data) || has(self.layers)) && !(has(self.data) && has(self.layers))" type Layer struct { // Name of the layer, required for layers on the 2nd or 3rd level // +kubebuilder:validations:MinLength:=1 @@ -187,7 +188,7 @@ type Layer struct { Data *Data `json:"data,omitempty"` // Sublayers of the layer - Layers *[]Layer `json:"layers,omitempty"` + Layers []Layer `json:"layers,omitempty"` } type WMSBoundingBox struct { @@ -322,9 +323,9 @@ func (wmsService *WMSService) GetAnnotatedLayers() []AnnotatedLayer { } result = append(result, annotatedTopLayer) - for _, topLayerChild := range *topLayer.Layers { + for _, topLayerChild := range topLayer.Layers { groupName := topLayer.Name - isGroupLayer := topLayerChild.Layers != nil && len(*topLayerChild.Layers) > 0 + isGroupLayer := topLayerChild.Layers != nil && len(topLayerChild.Layers) > 0 isDataLayer := !isGroupLayer result = append(result, AnnotatedLayer{ GroupName: groupName, @@ -334,8 +335,8 @@ func (wmsService *WMSService) GetAnnotatedLayers() []AnnotatedLayer { Layer: topLayerChild, }) - if topLayerChild.Layers != nil && len(*topLayerChild.Layers) > 0 { - for _, middleLayerChild := range *topLayerChild.Layers { + if len(topLayerChild.Layers) > 0 { + for _, middleLayerChild := range topLayerChild.Layers { groupName = topLayerChild.Name result = append(result, AnnotatedLayer{ GroupName: groupName, @@ -357,10 +358,8 @@ func (wmsService *WMSService) GetAllLayers() (layers []Layer) { func (layer *Layer) GetAllLayers() (layers []Layer) { layers = append(layers, *layer) - if layer.Layers != nil { - for _, childLayer := range *layer.Layers { - layers = append(layers, childLayer.GetAllLayers()...) - } + for _, childLayer := range layer.Layers { + layers = append(layers, childLayer.GetAllLayers()...) } return } @@ -370,7 +369,7 @@ func (layer *Layer) GetParent(candidateLayer *Layer) *Layer { return nil } - for _, childLayer := range *candidateLayer.Layers { + for _, childLayer := range candidateLayer.Layers { if childLayer.Name == layer.Name { return candidateLayer } @@ -417,11 +416,11 @@ func (layer *Layer) GetLayerType(service *WMSService) (layerType string) { } func (layer *Layer) IsDataLayer() bool { - return layer.hasData() && (layer.Layers == nil || len(*layer.Layers) == 0) + return layer.hasData() && len(layer.Layers) == 0 } func (layer *Layer) IsGroupLayer() bool { - return layer.Layers != nil && len(*layer.Layers) > 0 + return len(layer.Layers) > 0 } func (layer *Layer) IsTopLayer(service *WMSService) bool { @@ -438,12 +437,12 @@ func (layer *Layer) hasBoundingBoxForCRS(crs string) bool { } func (layer *Layer) setInheritedBoundingBoxes() { - if layer.Layers == nil || len(*layer.Layers) == 0 { + if len(layer.Layers) == 0 { return } var updatedLayers []Layer - for _, childLayer := range *layer.Layers { + for _, childLayer := range layer.Layers { // Inherit parent boundingboxes for _, boundingBox := range layer.BoundingBoxes { if !childLayer.hasBoundingBoxForCRS(boundingBox.CRS) { @@ -453,7 +452,7 @@ func (layer *Layer) setInheritedBoundingBoxes() { childLayer.setInheritedBoundingBoxes() updatedLayers = append(updatedLayers, childLayer) } - *layer.Layers = updatedLayers + layer.Layers = updatedLayers } func (wms *WMS) GetAllLayersWithLegend() (layers []Layer) { @@ -488,11 +487,11 @@ func (wms *WMS) GetAuthority() *Authority { return wms.Spec.Service.Layer.Authority } - for _, childLayer := range *wms.Spec.Service.Layer.Layers { + for _, childLayer := range wms.Spec.Service.Layer.Layers { if childLayer.Authority != nil { return childLayer.Authority } else if childLayer.Layers != nil { - for _, grandChildLayer := range *childLayer.Layers { + for _, grandChildLayer := range childLayer.Layers { if grandChildLayer.Authority != nil { return grandChildLayer.Authority } @@ -544,13 +543,13 @@ func (wms *WMS) GeoPackages() []*Gpkg { gpkgs := make([]*Gpkg, 0) if wms.Spec.Service.Layer.Layers != nil { - for _, layer := range *wms.Spec.Service.Layer.Layers { + for _, layer := range wms.Spec.Service.Layer.Layers { if layer.Data != nil { if layer.Data.Gpkg != nil { gpkgs = append(gpkgs, layer.Data.Gpkg) } } else if layer.Layers != nil { - for _, childLayer := range *layer.Layers { + for _, childLayer := range layer.Layers { if childLayer.Data != nil && childLayer.Data.Gpkg != nil { gpkgs = append(gpkgs, childLayer.Data.Gpkg) } diff --git a/api/v3/wms_types_test.go b/api/v3/wms_types_test.go index 1abeef1..85b1792 100644 --- a/api/v3/wms_types_test.go +++ b/api/v3/wms_types_test.go @@ -61,11 +61,11 @@ func TestLayer_setInheritedBoundingBoxes(t *testing.T) { layer: Layer{ Name: controller.Pointer("toplayer"), BoundingBoxes: []WMSBoundingBox{first28992BoundingBox}, - Layers: &[]Layer{ + Layers: []Layer{ { Name: controller.Pointer("grouplayer-1"), BoundingBoxes: []WMSBoundingBox{first4326BoundingBox}, - Layers: &[]Layer{ + Layers: []Layer{ { Name: controller.Pointer("datalayer-1"), BoundingBoxes: []WMSBoundingBox{first4258BoundingBox}, @@ -93,9 +93,9 @@ func TestLayer_setInheritedBoundingBoxes(t *testing.T) { layer := tt.layer layer.setInheritedBoundingBoxes() - topChildLayers := *layer.Layers + topChildLayers := layer.Layers groupLayer1 := topChildLayers[0] - groupChildLayers := *groupLayer1.Layers + groupChildLayers := groupLayer1.Layers dataLayer1 := groupChildLayers[0] dataLayer2 := groupChildLayers[1] @@ -129,8 +129,8 @@ func TestLayer_setInheritedBoundingBoxes(t *testing.T) { func TestLayer_GetParent(t *testing.T) { childLayer2 := Layer{Name: controller.Pointer("childlayer-2")} - childLayer1 := Layer{Name: controller.Pointer("childlayer-1"), Layers: &[]Layer{childLayer2}} - topLayer := Layer{Name: controller.Pointer("toplayer"), Layers: &[]Layer{childLayer1}} + childLayer1 := Layer{Name: controller.Pointer("childlayer-1"), Layers: []Layer{childLayer2}} + topLayer := Layer{Name: controller.Pointer("toplayer"), Layers: []Layer{childLayer1}} type args struct { candidateLayer *Layer diff --git a/api/v3/wms_validation.go b/api/v3/wms_validation.go index 91183aa..0439d03 100644 --- a/api/v3/wms_validation.go +++ b/api/v3/wms_validation.go @@ -17,7 +17,7 @@ func (wms *WMS) ValidateCreate() ([]string, error) { reasons = append(reasons, fmt.Sprintf("%v", err)) } - validateWMS(wms, &warnings, &reasons) + ValidateWMS(wms, &warnings, &reasons) if len(reasons) > 0 { return warnings, fmt.Errorf("%s", strings.Join(reasons, ". ")) @@ -42,7 +42,7 @@ func (wms *WMS) ValidateUpdate(wmsOld *WMS) ([]string, error) { reasons = append(reasons, "services cannot change from inspire to not inspire or the other way around") } - validateWMS(wms, &warnings, &reasons) + ValidateWMS(wms, &warnings, &reasons) if len(reasons) > 0 { return warnings, fmt.Errorf("%s", strings.Join(reasons, ". ")) @@ -51,7 +51,7 @@ func (wms *WMS) ValidateUpdate(wmsOld *WMS) ([]string, error) { return warnings, nil } -func validateWMS(wms *WMS, warnings *[]string, reasons *[]string) { +func ValidateWMS(wms *WMS, warnings *[]string, reasons *[]string) { if strings.Contains(wms.GetName(), "wms") { *warnings = append(*warnings, sharedValidation.FormatValidationWarning("name should not contain wms", wms.GroupVersionKind(), wms.GetName())) } @@ -209,11 +209,11 @@ func validateWMS(wms *WMS, warnings *[]string, reasons *[]string) { } func findEqualChildStyleNames(layer *Layer, equalStyleNames *map[string][]string) { - if layer.Layers == nil || len(*layer.Layers) == 0 { + if len(layer.Layers) == 0 { return } equalChildStyleNames := map[string][]string{} - for _, childLayer := range *layer.Layers { + for _, childLayer := range layer.Layers { if childLayer.Name == nil { // Name check is done elsewhere // To prevent errors here we just continue diff --git a/api/v3/wms_validation_test.go b/api/v3/wms_validation_test.go index 13f4856..468526d 100644 --- a/api/v3/wms_validation_test.go +++ b/api/v3/wms_validation_test.go @@ -25,14 +25,14 @@ func Test_getEqualChildStyleNames(t *testing.T) { {Name: "stylename-1"}, {Name: "stylename-2"}, }, - Layers: &[]Layer{ + Layers: []Layer{ { Name: controller.Pointer("childlayer-1"), Styles: []Style{ {Name: "stylename-2"}, {Name: "stylename-3"}, }, - Layers: &[]Layer{ + Layers: []Layer{ { Name: controller.Pointer("childlayer-2"), Styles: []Style{ @@ -60,14 +60,14 @@ func Test_getEqualChildStyleNames(t *testing.T) { {Name: "stylename-1"}, {Name: "stylename-2"}, }, - Layers: &[]Layer{ + Layers: []Layer{ { Name: controller.Pointer("childlayer-1"), Styles: []Style{ {Name: "stylename-3"}, {Name: "stylename-4"}, }, - Layers: &[]Layer{ + Layers: []Layer{ { Name: controller.Pointer("childlayer-2"), Styles: []Style{ diff --git a/api/v3/zz_generated.deepcopy.go b/api/v3/zz_generated.deepcopy.go index ce8b7cd..6349167 100644 --- a/api/v3/zz_generated.deepcopy.go +++ b/api/v3/zz_generated.deepcopy.go @@ -325,13 +325,9 @@ func (in *Layer) DeepCopyInto(out *Layer) { } if in.Layers != nil { in, out := &in.Layers, &out.Layers - *out = new([]Layer) - if **in != nil { - in, out := *in, *out - *out = make([]Layer, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } + *out = make([]Layer, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } } diff --git a/config/crd/bases/embed.go b/config/crd/bases/embed.go new file mode 100644 index 0000000..8ce7a4d --- /dev/null +++ b/config/crd/bases/embed.go @@ -0,0 +1,38 @@ +package bases + +import ( + _ "embed" + "github.com/pdok/smooth-operator/pkg/validation" + v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "sigs.k8s.io/yaml" +) + +//go:embed pdok.nl_wfs.yaml +var wfsCRD []byte + +//go:embed pdok.nl_wms.yaml +var wmsCRD []byte + +func init() { + wms := v1.CustomResourceDefinition{} + err := yaml.Unmarshal(wmsCRD, &wms) + if err != nil { + panic(err) + } + + err = validation.AddValidator(wms) + if err != nil { + panic(err) + } + + wfs := v1.CustomResourceDefinition{} + err = yaml.Unmarshal(wfsCRD, &wfs) + if err != nil { + panic(err) + } + + err = validation.AddValidator(wfs) + if err != nil { + panic(err) + } +} diff --git a/config/crd/bases/pdok.nl_wfs.yaml b/config/crd/bases/pdok.nl_wfs.yaml index cfcc301..b2477f7 100644 --- a/config/crd/bases/pdok.nl_wfs.yaml +++ b/config/crd/bases/pdok.nl_wfs.yaml @@ -1150,7 +1150,6 @@ spec: type: string accessConstraints: default: https://creativecommons.org/publicdomain/zero/1.0/deed.nl - description: AccessConstraints URL minLength: 1 pattern: https?:// type: string diff --git a/config/crd/bases/pdok.nl_wfses.yaml b/config/crd/bases/pdok.nl_wfses.yaml index 27a3587..c912252 100644 --- a/config/crd/bases/pdok.nl_wfses.yaml +++ b/config/crd/bases/pdok.nl_wfses.yaml @@ -179,6 +179,7 @@ spec: abstract: type: string accessConstraints: + default: https://creativecommons.org/publicdomain/zero/1.0/deed.nl type: string authority: description: Authority is a struct for the authority fields in @@ -353,7 +354,6 @@ spec: required: - general - kubernetes - - options - service type: object status: diff --git a/config/crd/bases/pdok.nl_wms.yaml b/config/crd/bases/pdok.nl_wms.yaml index 213758d..226977e 100644 --- a/config/crd/bases/pdok.nl_wms.yaml +++ b/config/crd/bases/pdok.nl_wms.yaml @@ -1098,23 +1098,33 @@ spec: properties: automaticCasing: default: true + description: AutomaticCasing enables automatic conversion from snake_case to camelCase. type: boolean disableWebserviceProxy: default: false + description: DisableWebserviceProxy disables the built-in proxy for external web services. type: boolean includeIngress: default: true + description: IncludeIngress dictates whether to deploy an Ingress or ensure none exists. type: boolean prefetchData: default: true + description: |- + Whether to prefetch data from blob storage, and store it on the local filesystem. + If `false`, the data will be served directly out of blob storage type: boolean rewriteGroupToDataLayers: default: false + description: RewriteGroupToDataLayers merges group layers into individual data layers. type: boolean validateChildStyleNameEqual: + default: false + description: ValidateChildStyleNameEqual ensures child style names match the parent style. type: boolean validateRequests: default: true + description: ValidateRequests enables request validation against the service schema. type: boolean required: - automaticCasing @@ -1134,6 +1144,7 @@ spec: accessConstraints: default: https://creativecommons.org/publicdomain/zero/1.0/deed.nl description: AccessConstraints (licence) that are applicable to the service + pattern: https?://.* type: string dataEPSG: description: CRS of the data @@ -1149,21 +1160,33 @@ spec: description: Optional specification Inspire themes and ids properties: language: + description: Language of the INSPIRE metadata record + minLength: 1 type: string serviceMetadataUrl: + description: ServiceMetadataURL references the CSW or custom metadata record. properties: csw: + description: CSW describes a metadata record via a metadataIdentifier (UUID). properties: metadataIdentifier: + description: MetadataIdentifier is the record's UUID + format: uuid + minLength: 1 type: string required: - metadataIdentifier type: object custom: + description: Custom allows arbitrary href properties: href: + minLength: 1 + pattern: ^https?://.*$ type: string type: + description: MIME type of the custom link + minLength: 1 type: string required: - href @@ -1173,6 +1196,8 @@ spec: - csw type: object spatialDatasetIdentifier: + description: SpatialDatasetIdentifier is the ID uniquely identifying the dataset. + minLength: 1 type: string required: - language @@ -1244,23 +1269,39 @@ spec: description: Data (gpkg/postgis/tif) used by the layer properties: gpkg: + description: Gpkg configures a GeoPackage file source properties: blobKey: + description: Blobkey identifies the location/bucket of the .gpkg file + minLength: 1 + pattern: \.gpkg$ type: string columns: + description: Columns to visualize for this table items: + description: Column maps a source column name to an optional alias for output. properties: alias: + description: Alias for the column in the service output. + minLength: 1 type: string name: + description: Name of the column in the data source. + minLength: 1 type: string required: - name type: object + minItems: 1 type: array geometryType: + description: GeometryType of the table, must match an OGC type + minLength: 1 + pattern: ^(Multi)?(Point|LineString|Polygon)$ type: string tableName: + description: TableName is the table within the geopackage + minLength: 1 type: string required: - blobKey @@ -1269,22 +1310,34 @@ spec: - tableName type: object postgis: - description: Postgis - reference to table in a Postgres database + description: Postgis configures a Postgis table source properties: columns: + description: Columns to expose from table items: + description: Column maps a source column name to an optional alias for output. properties: alias: + description: Alias for the column in the service output. + minLength: 1 type: string name: + description: Name of the column in the data source. + minLength: 1 type: string required: - name type: object + minItems: 1 type: array geometryType: + description: GeometryType of the table + minLength: 1 + pattern: ^(Multi)?(Point|LineString|Polygon)$ type: string tableName: + description: TableName in postGIS + minLength: 1 type: string required: - columns @@ -1292,34 +1345,55 @@ spec: - tableName type: object tif: + description: TIF configures a GeoTIF raster source properties: blobKey: + description: BlobKey to the TIFF file + minLength: 1 + pattern: \.(tif|tiff)$ type: string getFeatureInfoIncludesClass: + description: Include class names in GetFeatureInfo responses type: boolean offsite: + description: Offsite color for nodata removal + minLength: 1 type: string resample: + description: Resample method + minLength: 1 type: string required: - blobKey type: object type: object + x-kubernetes-validations: + - message: Atleast one of the datasource should be provided (postgis, gpkg, tif) + rule: has(self.gpkg) || has(self.tif) || has(self.postgis) datasetMetadataUrl: description: Links to metadata properties: csw: + description: CSW describes a metadata record via a metadataIdentifier (UUID). properties: metadataIdentifier: + description: MetadataIdentifier is the record's UUID + format: uuid + minLength: 1 type: string required: - metadataIdentifier type: object custom: + description: Custom allows arbitrary href properties: href: + minLength: 1 + pattern: ^https?://.*$ type: string type: + description: MIME type of the custom link + minLength: 1 type: string required: - href @@ -1396,23 +1470,39 @@ spec: description: Data (gpkg/postgis/tif) used by the layer properties: gpkg: + description: Gpkg configures a GeoPackage file source properties: blobKey: + description: Blobkey identifies the location/bucket of the .gpkg file + minLength: 1 + pattern: \.gpkg$ type: string columns: + description: Columns to visualize for this table items: + description: Column maps a source column name to an optional alias for output. properties: alias: + description: Alias for the column in the service output. + minLength: 1 type: string name: + description: Name of the column in the data source. + minLength: 1 type: string required: - name type: object + minItems: 1 type: array geometryType: + description: GeometryType of the table, must match an OGC type + minLength: 1 + pattern: ^(Multi)?(Point|LineString|Polygon)$ type: string tableName: + description: TableName is the table within the geopackage + minLength: 1 type: string required: - blobKey @@ -1421,22 +1511,34 @@ spec: - tableName type: object postgis: - description: Postgis - reference to table in a Postgres database + description: Postgis configures a Postgis table source properties: columns: + description: Columns to expose from table items: + description: Column maps a source column name to an optional alias for output. properties: alias: + description: Alias for the column in the service output. + minLength: 1 type: string name: + description: Name of the column in the data source. + minLength: 1 type: string required: - name type: object + minItems: 1 type: array geometryType: + description: GeometryType of the table + minLength: 1 + pattern: ^(Multi)?(Point|LineString|Polygon)$ type: string tableName: + description: TableName in postGIS + minLength: 1 type: string required: - columns @@ -1444,34 +1546,55 @@ spec: - tableName type: object tif: + description: TIF configures a GeoTIF raster source properties: blobKey: + description: BlobKey to the TIFF file + minLength: 1 + pattern: \.(tif|tiff)$ type: string getFeatureInfoIncludesClass: + description: Include class names in GetFeatureInfo responses type: boolean offsite: + description: Offsite color for nodata removal + minLength: 1 type: string resample: + description: Resample method + minLength: 1 type: string required: - blobKey type: object type: object + x-kubernetes-validations: + - message: Atleast one of the datasource should be provided (postgis, gpkg, tif) + rule: has(self.gpkg) || has(self.tif) || has(self.postgis) datasetMetadataUrl: description: Links to metadata properties: csw: + description: CSW describes a metadata record via a metadataIdentifier (UUID). properties: metadataIdentifier: + description: MetadataIdentifier is the record's UUID + format: uuid + minLength: 1 type: string required: - metadataIdentifier type: object custom: + description: Custom allows arbitrary href properties: href: + minLength: 1 + pattern: ^https?://.*$ type: string type: + description: MIME type of the custom link + minLength: 1 type: string required: - href @@ -1548,23 +1671,39 @@ spec: description: Data (gpkg/postgis/tif) used by the layer properties: gpkg: + description: Gpkg configures a GeoPackage file source properties: blobKey: + description: Blobkey identifies the location/bucket of the .gpkg file + minLength: 1 + pattern: \.gpkg$ type: string columns: + description: Columns to visualize for this table items: + description: Column maps a source column name to an optional alias for output. properties: alias: + description: Alias for the column in the service output. + minLength: 1 type: string name: + description: Name of the column in the data source. + minLength: 1 type: string required: - name type: object + minItems: 1 type: array geometryType: + description: GeometryType of the table, must match an OGC type + minLength: 1 + pattern: ^(Multi)?(Point|LineString|Polygon)$ type: string tableName: + description: TableName is the table within the geopackage + minLength: 1 type: string required: - blobKey @@ -1573,22 +1712,34 @@ spec: - tableName type: object postgis: - description: Postgis - reference to table in a Postgres database + description: Postgis configures a Postgis table source properties: columns: + description: Columns to expose from table items: + description: Column maps a source column name to an optional alias for output. properties: alias: + description: Alias for the column in the service output. + minLength: 1 type: string name: + description: Name of the column in the data source. + minLength: 1 type: string required: - name type: object + minItems: 1 type: array geometryType: + description: GeometryType of the table + minLength: 1 + pattern: ^(Multi)?(Point|LineString|Polygon)$ type: string tableName: + description: TableName in postGIS + minLength: 1 type: string required: - columns @@ -1596,34 +1747,55 @@ spec: - tableName type: object tif: + description: TIF configures a GeoTIF raster source properties: blobKey: + description: BlobKey to the TIFF file + minLength: 1 + pattern: \.(tif|tiff)$ type: string getFeatureInfoIncludesClass: + description: Include class names in GetFeatureInfo responses type: boolean offsite: + description: Offsite color for nodata removal + minLength: 1 type: string resample: + description: Resample method + minLength: 1 type: string required: - blobKey type: object type: object + x-kubernetes-validations: + - message: Atleast one of the datasource should be provided (postgis, gpkg, tif) + rule: has(self.gpkg) || has(self.tif) || has(self.postgis) datasetMetadataUrl: description: Links to metadata properties: csw: + description: CSW describes a metadata record via a metadataIdentifier (UUID). properties: metadataIdentifier: + description: MetadataIdentifier is the record's UUID + format: uuid + minLength: 1 type: string required: - metadataIdentifier type: object custom: + description: Custom allows arbitrary href properties: href: + minLength: 1 + pattern: ^https?://.*$ type: string type: + description: MIME type of the custom link + minLength: 1 type: string required: - href @@ -1753,8 +1925,8 @@ spec: - name type: object x-kubernetes-validations: - - message: A layer can only have data or layers, not both. - rule: has(self.data) || has(self.layers) + - message: A layer should have sublayers or data, not both + rule: (has(self.data) || has(self.layers)) && !(has(self.data) && has(self.layers)) type: array maxscaledenominator: description: The maximum scale at which this layer functions @@ -1812,8 +1984,8 @@ spec: - keywords type: object x-kubernetes-validations: - - message: A layer can only have data or layers, not both. - rule: has(self.data) || has(self.layers) + - message: A layer should have sublayers or data, not both + rule: (has(self.data) || has(self.layers)) && !(has(self.data) && has(self.layers)) mapfile: description: Custom mapfile properties: @@ -1886,7 +2058,6 @@ spec: type: string required: - abstract - - accessConstraints - dataEPSG - keywords - layer diff --git a/config/crd/bases/pdok.nl_wmses.yaml b/config/crd/bases/pdok.nl_wmses.yaml index acb175d..86bb8b4 100644 --- a/config/crd/bases/pdok.nl_wmses.yaml +++ b/config/crd/bases/pdok.nl_wmses.yaml @@ -179,6 +179,7 @@ spec: abstract: type: string accessConstraints: + default: https://creativecommons.org/publicdomain/zero/1.0/deed.nl type: string authority: description: Authority is a struct for the authority fields in @@ -330,7 +331,6 @@ spec: visible: type: boolean required: - - labelNoClip - name - styles - visible diff --git a/go.mod b/go.mod index c69ec76..72f3ce5 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/pdok/featureinfo-generator v1.4.0-beta1 github.com/pdok/ogc-capabilities-generator v1.0.0-beta7 github.com/pdok/ogc-specifications v1.0.0-beta7 - github.com/pdok/smooth-operator v0.0.18-0.20250502130008-44dd7efe5125 + github.com/pdok/smooth-operator v0.0.18 github.com/stretchr/testify v1.10.0 github.com/traefik/traefik/v3 v3.3.4 k8s.io/api v0.32.3 @@ -74,7 +74,7 @@ require ( github.com/go-errors/errors v1.5.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-logr/zapr v1.3.0 github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect @@ -114,7 +114,7 @@ require ( go.opentelemetry.io/otel/trace v1.35.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect + go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e // indirect golang.org/x/net v0.38.0 // indirect golang.org/x/oauth2 v0.28.0 // indirect diff --git a/go.sum b/go.sum index 498fff5..8bb82e8 100644 --- a/go.sum +++ b/go.sum @@ -153,10 +153,8 @@ github.com/pdok/ogc-capabilities-generator v1.0.0-beta7 h1:w0dP2RQX0KEEovrq57NCM github.com/pdok/ogc-capabilities-generator v1.0.0-beta7/go.mod h1:slk89sAgmWU5NCIKwGyciQWnm0RHmwhJYQ431E2CwSk= github.com/pdok/ogc-specifications v1.0.0-beta7 h1:AFSO8iCYbD1MrjOS2q+PGp2PmSqAH+O7cuA7JeePCXE= github.com/pdok/ogc-specifications v1.0.0-beta7/go.mod h1:YDngwkwrWOfc5MYnEYseiv97K1Y9bZXlVzwi/8EaIl8= -github.com/pdok/smooth-operator v0.0.16 h1:1vurI2TPDHmTaTu0YeG1B9mIIa5MT6GPWhixiZ/styg= -github.com/pdok/smooth-operator v0.0.16/go.mod h1:ohDqrUnmS7wK8TrNHJnFS/mDgf26Yhb8mtRBX3ixdr4= -github.com/pdok/smooth-operator v0.0.18-0.20250502130008-44dd7efe5125 h1:0ZIPfe6USM5Jm0MC8tngDxPIFvBSTOrNY53S7pA9Lh4= -github.com/pdok/smooth-operator v0.0.18-0.20250502130008-44dd7efe5125/go.mod h1:ohDqrUnmS7wK8TrNHJnFS/mDgf26Yhb8mtRBX3ixdr4= +github.com/pdok/smooth-operator v0.0.18 h1:cwgfNdnDSQgwgYBcoXszdaCIEdCU/d66VMqpCmv24qQ= +github.com/pdok/smooth-operator v0.0.18/go.mod h1:ohDqrUnmS7wK8TrNHJnFS/mDgf26Yhb8mtRBX3ixdr4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/internal/controller/blobdownload/blob_download_test.go b/internal/controller/blobdownload/blob_download_test.go index 08bfe17..206a54b 100644 --- a/internal/controller/blobdownload/blob_download_test.go +++ b/internal/controller/blobdownload/blob_download_test.go @@ -154,7 +154,7 @@ func TestGetArgsForWMS(t *testing.T) { }, }, }, - Layers: &[]v3.Layer{ + Layers: []v3.Layer{ { Name: smoothoperatorutils.Pointer("wms-gpkg-layer-1-name"), Title: smoothoperatorutils.Pointer("wms-gpkg-layer-1-title"), @@ -224,7 +224,7 @@ func TestGetArgsForWMS(t *testing.T) { Layer: v3.Layer{ Name: smoothoperatorutils.Pointer("wms-tif-layer-name"), Title: smoothoperatorutils.Pointer("wms-tif-layer-title"), - Layers: &[]v3.Layer{ + Layers: []v3.Layer{ { Name: smoothoperatorutils.Pointer("wms-tif-layer-1-name"), Title: smoothoperatorutils.Pointer("wms-tif-layer-1-title"), diff --git a/internal/controller/capabilitiesgenerator/capabilities_generator_test.go b/internal/controller/capabilitiesgenerator/capabilities_generator_test.go index 92b5970..759927c 100644 --- a/internal/controller/capabilitiesgenerator/capabilities_generator_test.go +++ b/internal/controller/capabilitiesgenerator/capabilities_generator_test.go @@ -644,11 +644,11 @@ func TestGetInputForWFS(t *testing.T) { func TestInputForWMS(t *testing.T) { //nolint:misspell v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: rws-nwbwegen-v1-0\n labels:\n dataset-owner: rws\n dataset: nwbwegen\n service-version: v1_0\n service-type: wms\n annotations:\n lifecycle-phase: prod\n service-bundle-id: b39c152b-393b-52f5-a50c-e1ffe904b6fb\nspec:\n general:\n datasetOwner: rws\n dataset: nwbwegen\n serviceVersion: v1_0\n kubernetes:\n healthCheck:\n boundingbox: 135134.89,457152.55,135416.03,457187.82\n resources:\n limits:\n ephemeralStorage: 1535Mi\n memory: 4G\n requests:\n cpu: 2000m\n ephemeralStorage: 1535Mi\n memory: 4G\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n service:\n title: NWB - Wegen WMS\n abstract:\n Dit is de web map service van het Nationaal Wegen Bestand (NWB) - wegen.\n Deze dataset bevat alleen de wegvakken en hectometerpunten. Het Nationaal Wegen\n Bestand - Wegen is een digitaal geografisch bestand van alle wegen in Nederland.\n Opgenomen zijn alle wegen die worden beheerd door wegbeheerders als het Rijk,\n provincies, gemeenten en waterschappen, echter alleen voor zover deze zijn voorzien\n van een straatnaam of nummer.\n authority:\n name: rws\n url: https://www.rijkswaterstaat.nl\n dataEPSG: EPSG:28992\n extent: -59188.44333693248 304984.64144318487 308126.88473339565 858328.516489961\n inspire: true\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n - Hectometerpunten\n - HVD\n - Mobiliteit\n stylingAssets:\n configMapRefs:\n - name: includes\n keys:\n - nwb_wegen_hectopunten.symbol\n - hectopunten.style\n - wegvakken.style\n blobKeys:\n - resources/fonts/liberation-sans.ttf\n layers:\n - abstract:\n Deze laag bevat de wegvakken uit het Nationaal Wegen bestand (NWB)\n en geeft gedetailleerde informatie per wegvak zoals straatnaam, wegnummer,\n routenummer, wegbeheerder, huisnummers, enz. weer.\n data:\n gpkg:\n columns:\n - objectid\n - wvk_id\n - wvk_begdat\n - jte_id_beg\n - jte_id_end\n - wegbehsrt\n - wegnummer\n - wegdeelltr\n - hecto_lttr\n - bst_code\n - rpe_code\n - admrichtng\n - rijrichtng\n - stt_naam\n - stt_bron\n - wpsnaam\n - gme_id\n - gme_naam\n - hnrstrlnks\n - hnrstrrhts\n - e_hnr_lnks\n - e_hnr_rhts\n - l_hnr_lnks\n - l_hnr_rhts\n - begafstand\n - endafstand\n - beginkm\n - eindkm\n - pos_tv_wol\n - wegbehcode\n - wegbehnaam\n - distrcode\n - distrnaam\n - dienstcode\n - dienstnaam\n - wegtype\n - wgtype_oms\n - routeltr\n - routenr\n - routeltr2\n - routenr2\n - routeltr3\n - routenr3\n - routeltr4\n - routenr4\n - wegnr_aw\n - wegnr_hmp\n - geobron_id\n - geobron_nm\n - bronjaar\n - openlr\n - bag_orl\n - frc\n - fow\n - alt_naam\n - alt_nr\n - rel_hoogte\n - st_lengthshape\n geometryType: MultiLineString\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: wegvakken\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n maxScale: 50000.0\n minScale: 1.0\n name: wegvakken\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: wegvakken\n title: NWB - Wegvakken\n visualization: wegvakken.style\n title: Wegvakken\n visible: true\n - abstract:\n Deze laag bevat de hectopunten uit het Nationaal Wegen Bestand (NWB)\n en geeft gedetailleerde informatie per hectopunt zoals hectometrering, afstand,\n zijde en hectoletter weer.\n data:\n gpkg:\n columns:\n - objectid\n - hectomtrng\n - afstand\n - wvk_id\n - wvk_begdat\n - zijde\n - hecto_lttr\n geometryType: MultiPoint\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: hectopunten\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Hectometerpunten\n maxScale: 50000.0\n minScale: 1.0\n name: hectopunten\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: hectopunten\n title: NWB - Hectopunten\n visualization: hectopunten.style\n title: Hectopunten\n visible: true\n metadataIdentifier: f2437a92-ddd3-4777-a1bc-fdf4b4a7fcb8\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) pdoknlv3.SetHost("http://localhost") contactPersonPrimary := smoothoperatorv1.ContactPersonPrimary{ diff --git a/internal/controller/capabilitiesgenerator/mapper.go b/internal/controller/capabilitiesgenerator/mapper.go index 7c3f4ba..05afeb5 100644 --- a/internal/controller/capabilitiesgenerator/mapper.go +++ b/internal/controller/capabilitiesgenerator/mapper.go @@ -542,7 +542,7 @@ func getLayers(wms *pdoknlv3.WMS, canonicalURL string) []wms130.Layer { Layer: []*wms130.Layer{}, } - for _, layer := range *referenceLayer.Layers { + for _, layer := range referenceLayer.Layers { var minScaleDenom *float64 var maxScaleDenom *float64 var innerIdentifier *wms130.Identifier diff --git a/internal/controller/featureinfogenerator/featureinfo_generator_test.go b/internal/controller/featureinfogenerator/featureinfo_generator_test.go index 4df5a13..86c9dd0 100644 --- a/internal/controller/featureinfogenerator/featureinfo_generator_test.go +++ b/internal/controller/featureinfogenerator/featureinfo_generator_test.go @@ -79,10 +79,10 @@ func TestGetInput(t *testing.T) { Service: pdoknlv3.WMSService{ Layer: pdoknlv3.Layer{ Name: smoothoperatorutils.Pointer("top-layer-name"), - Layers: &[]pdoknlv3.Layer{ + Layers: []pdoknlv3.Layer{ { Name: smoothoperatorutils.Pointer("group-layer-name"), - Layers: &[]pdoknlv3.Layer{ + Layers: []pdoknlv3.Layer{ { Name: smoothoperatorutils.Pointer("gpkg-layer-name"), Data: &pdoknlv3.Data{ diff --git a/internal/controller/legendgenerator/legend_generator_test.go b/internal/controller/legendgenerator/legend_generator_test.go index d30ba9c..77a1fe8 100644 --- a/internal/controller/legendgenerator/legend_generator_test.go +++ b/internal/controller/legendgenerator/legend_generator_test.go @@ -11,11 +11,11 @@ import ( func TestGetConfigMapDataNoLegendFix(t *testing.T) { //nolint:misspell v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: rws-nwbwegen-v1-0\n labels:\n dataset-owner: rws\n dataset: nwbwegen\n service-version: v1_0\n service-type: wms\n annotations:\n lifecycle-phase: prod\n service-bundle-id: b39c152b-393b-52f5-a50c-e1ffe904b6fb\nspec:\n general:\n datasetOwner: rws\n dataset: nwbwegen\n serviceVersion: v1_0\n kubernetes:\n healthCheck:\n boundingbox: 135134.89,457152.55,135416.03,457187.82\n resources:\n limits:\n ephemeralStorage: 1535Mi\n memory: 4G\n requests:\n cpu: 2000m\n ephemeralStorage: 1535Mi\n memory: 4G\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n service:\n title: NWB - Wegen WMS\n abstract:\n Dit is de web map service van het Nationaal Wegen Bestand (NWB) - wegen.\n Deze dataset bevat alleen de wegvakken en hectometerpunten. Het Nationaal Wegen\n Bestand - Wegen is een digitaal geografisch bestand van alle wegen in Nederland.\n Opgenomen zijn alle wegen die worden beheerd door wegbeheerders als het Rijk,\n provincies, gemeenten en waterschappen, echter alleen voor zover deze zijn voorzien\n van een straatnaam of nummer.\n authority:\n name: rws\n url: https://www.rijkswaterstaat.nl\n dataEPSG: EPSG:28992\n extent: -59188.44333693248 304984.64144318487 308126.88473339565 858328.516489961\n inspire: true\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n - Hectometerpunten\n - HVD\n - Mobiliteit\n stylingAssets:\n configMapRefs:\n - name: includes\n keys:\n - nwb_wegen_hectopunten.symbol\n - hectopunten.style\n - wegvakken.style\n blobKeys:\n - resources/fonts/liberation-sans.ttf\n layers:\n - abstract:\n Deze laag bevat de wegvakken uit het Nationaal Wegen bestand (NWB)\n en geeft gedetailleerde informatie per wegvak zoals straatnaam, wegnummer,\n routenummer, wegbeheerder, huisnummers, enz. weer.\n data:\n gpkg:\n columns:\n - objectid\n - wvk_id\n - wvk_begdat\n - jte_id_beg\n - jte_id_end\n - wegbehsrt\n - wegnummer\n - wegdeelltr\n - hecto_lttr\n - bst_code\n - rpe_code\n - admrichtng\n - rijrichtng\n - stt_naam\n - stt_bron\n - wpsnaam\n - gme_id\n - gme_naam\n - hnrstrlnks\n - hnrstrrhts\n - e_hnr_lnks\n - e_hnr_rhts\n - l_hnr_lnks\n - l_hnr_rhts\n - begafstand\n - endafstand\n - beginkm\n - eindkm\n - pos_tv_wol\n - wegbehcode\n - wegbehnaam\n - distrcode\n - distrnaam\n - dienstcode\n - dienstnaam\n - wegtype\n - wgtype_oms\n - routeltr\n - routenr\n - routeltr2\n - routenr2\n - routeltr3\n - routenr3\n - routeltr4\n - routenr4\n - wegnr_aw\n - wegnr_hmp\n - geobron_id\n - geobron_nm\n - bronjaar\n - openlr\n - bag_orl\n - frc\n - fow\n - alt_naam\n - alt_nr\n - rel_hoogte\n - st_lengthshape\n geometryType: MultiLineString\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: wegvakken\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n maxScale: 50000.0\n minScale: 1.0\n name: wegvakken\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: wegvakken\n title: NWB - Wegvakken\n visualization: wegvakken.style\n title: Wegvakken\n visible: true\n - abstract:\n Deze laag bevat de hectopunten uit het Nationaal Wegen Bestand (NWB)\n en geeft gedetailleerde informatie per hectopunt zoals hectometrering, afstand,\n zijde en hectoletter weer.\n data:\n gpkg:\n columns:\n - objectid\n - hectomtrng\n - afstand\n - wvk_id\n - wvk_begdat\n - zijde\n - hecto_lttr\n geometryType: MultiPoint\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: hectopunten\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Hectometerpunten\n maxScale: 50000.0\n minScale: 1.0\n name: hectopunten\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: hectopunten\n title: NWB - Hectopunten\n visualization: hectopunten.style\n title: Hectopunten\n visible: true\n metadataIdentifier: f2437a92-ddd3-4777-a1bc-fdf4b4a7fcb8\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) configMapData := GetConfigMapData(&wms) @@ -30,11 +30,11 @@ func TestGetConfigMapDataNoLegendFix(t *testing.T) { func TestGetConfigMapDataLegendFix(t *testing.T) { //nolint:misspell v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: kadaster-kadastralekaart\n labels:\n dataset-owner: kadaster\n dataset: kadastralekaart\n service-version: v5_0\n service-type: wms\nspec:\n general:\n datasetOwner: kadaster\n dataset: kadastralekaart\n serviceVersion: v5_0\n kubernetes:\n healthCheck:\n querystring: language=dut&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&BBOX=193882.0336615453998,470528.1693874415942,193922.4213813782844,470564.250484353397&CRS=EPSG:28992&WIDTH=769&HEIGHT=687&LAYERS=OpenbareRuimteNaam,Bebouwing,Perceel,KadastraleGrens&FORMAT=image/png&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE\n mimetype: image/png\n resources:\n limits:\n memory: \"100M\"\n ephemeralStorage: \"200M\"\n requests:\n cpu: \"500\"\n memory: \"100M\"\n ephemeralStorage: \"100M\"\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n rewriteGroupToDataLayers: true\n service:\n inspire: false\n title: Kadastrale Kaart (WMS)\n abstract: Overzicht van de ligging van de kadastrale percelen in Nederland. Fungeert als schakel tussen terrein en registratie, vervult voor externe gebruiker vaak een referentiefunctie, een ondergrond ten opzichte waarvan de gebruiker eigen informatie kan vastleggen en presenteren.\n keywords:\n - Kadaster\n - Kadastrale percelen\n - Kadastrale grens\n - Kadastrale kaart\n - Bebouwing\n - Nummeraanduidingreeks\n - Openbare ruimte naam\n - Perceel\n - Grens\n - Kwaliteit\n - Kwaliteitslabels\n - HVD\n - Geospatiale data\n metadataIdentifier: 97cf6a64-9cfc-4ce6-9741-2db44fd27fca\n authority:\n name: kadaster\n url: https://www.kadaster.nl\n dataEPSG: EPSG:28992\n resolution: 91\n defResolution: 91\n extent: \"-25000 250000 280000 860000\"\n maxSize: 10000\n stylingAssets:\n configMapRefs:\n - name: ${INCLUDES}\n blobKeys:\n - ${BLOBS_RESOURCES_BUCKET}/fonts/liberation-sans.ttf\n - ${BLOBS_RESOURCES_BUCKET}/fonts/liberation-sans-italic.ttf\n layers:\n - name: Kadastralekaart\n title: KadastraleKaartv5\n abstract: Overzicht van de ligging van de kadastrale percelen in Nederland. Fungeert als schakel tussen terrein en registratie, vervult voor externe gebruiker vaak een referentiefunctie, een ondergrond ten opzichte waarvan de gebruiker eigen informatie kan vastleggen en presenteren.\n maxScale: 6001\n keywords:\n - Kadaster\n - Kadastrale percelen\n - Kadastrale grens\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n - name: Bebouwing\n visible: true\n group: Kadastralekaart\n title: Bebouwing\n abstract: De laag Bebouwing is een selectie op panden van de BGT.\n keywords:\n - Bebouwing\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard:bebouwing\n title: Standaardvisualisatie Bebouwing\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n - name: kwaliteit:bebouwing\n title: Kwaliteitsvisualisatie Bebouwing\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n - name: print:bebouwing\n title: Printvisualisatie Bebouwing\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n - name: Bebouwingvlak\n visible: true\n group: Bebouwing\n title: Bebouwingvlak\n abstract: De laag Bebouwing is een selectie op panden van de BGT.\n keywords:\n - Bebouwing\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bebouwing.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bebouwing_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bebouwing_print.style\n - name: standaard:bebouwing\n title: Standaardvisualisatie Bebouwing\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bebouwing.group.style\n - name: kwaliteit:bebouwing\n title: Kwaliteitsvisualisatie Bebouwing\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bebouwing_kwaliteit.group.style\n - name: print:bebouwing\n title: Printvisualisatie Bebouwing\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bebouwing_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/pand.gpkg\n table: pand\n geometryType: Polygon\n columns:\n - object_begin_tijd\n - lv_publicatiedatum\n - relatieve_hoogteligging\n - in_onderzoek\n - tijdstip_registratie\n - identificatie_namespace\n - identificatie_lokaal_id\n - bronhouder\n - bgt_status\n - plus_status\n - identificatie_bag_pnd\n aliases:\n lv_publicatiedatum: LV-publicatiedatum\n identificatie_lokaal_id: identificatieLokaalID\n identificatie_bag_pnd: identificatieBAGPND\n bgt_status: bgt-status\n plus_status: plus-status\n - name: Nummeraanduidingreeks\n visible: true\n group: Bebouwing\n title: Nummeraanduidingreeks\n abstract: De laag Bebouwing is een selectie op panden van de BGT.\n keywords:\n - Nummeraanduidingreeks\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 2001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaarvisualisatie van de nummeraanduidingreeks.\n visualization: nummeraanduidingreeks.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: nummeraanduidingreeks_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: nummeraanduidingreeks_print.style\n - name: standaard:bebouwing\n title: Standaardvisualisatie Bebouwing\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: nummeraanduidingreeks.group.style\n - name: kwaliteit:bebouwing\n title: Kwaliteitsvisualisatie Bebouwing\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: nummeraanduidingreeks_kwaliteit.group.style\n - name: print:bebouwing\n title: Printvisualisatie Bebouwing\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: nummeraanduidingreeks_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/pand_nummeraanduiding.gpkg\n table: pand_nummeraanduiding\n geometryType: Point\n columns:\n - bebouwing_id\n - hoek\n - tekst\n - bag_vbo_laagste_huisnummer\n - bag_vbo_hoogste_huisnummer\n - hoek\n aliases:\n bebouwing_id: bebouwingID\n bag_vbo_laagste_huisnummer: identificatie_BAGVBOLaagsteHuisnummer\n bag_vbo_hoogste_huisnummer: identificatie_BAGVBOHoogsteHuisnummer\n - name: OpenbareRuimteNaam\n visible: true\n group: Kadastralekaart\n title: OpenbareRuimteNaam\n abstract: De laag Openbareruimtenaam is een selectie op de openbare ruimte labels van de BGT met een bgt-status \"bestaand\" die een classificatie (openbareruimtetype) Weg en Water hebben.\n keywords:\n - Openbare ruimte naam\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 2001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: openbareruimtenaam.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: openbareruimtenaam_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: openbareruimtenaam_print.style\n - name: standaard:openbareruimtenaam\n title: Standaardvisualisatie OpenbareRuimteNaam\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: openbareruimtenaam.group.style\n - name: kwaliteit:openbareruimtenaam\n title: Kwaliteitsvisualisatie OpenbareRuimteNaam\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: openbareruimtenaam_kwaliteit.group.style\n - name: print:openbareruimtenaam\n title: Printvisualisatie OpenbareRuimteNaam\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: openbareruimtenaam_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/openbareruimtelabel.gpkg\n table: openbareruimtelabel\n geometryType: Point\n columns:\n - object_begin_tijd\n - lv_publicatiedatum\n - relatieve_hoogteligging\n - in_onderzoek\n - tijdstip_registratie\n - identificatie_namespace\n - identificatie_lokaal_id\n - bronhouder\n - bgt_status\n - plus_status\n - identificatie_bag_opr\n - tekst\n - hoek\n - openbare_ruimte_type\n aliases:\n lv_publicatiedatum: LV-publicatiedatum\n identificatie_lokaal_id: identificatieLokaalID\n identificatie_bag_opr: identificatieBAGOPR\n bgt_status: bgt-status\n plus_status: plus-status\n - name: Perceel\n visible: true\n group: Kadastralekaart\n title: Perceel\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Perceel\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n - name: Perceelvlak\n visible: true\n group: Perceel\n title: Perceelvlak\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: perceelvlak.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: perceelvlak_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: perceelvlak_print.style\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: perceelvlak.group.style\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: perceelvlak_kwaliteit.group.style\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: perceelvlak_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/perceel.gpkg\n table: perceel\n geometryType: Polygon\n columns:\n - identificatie_namespace\n - identificatie_lokaal_id\n - begin_geldigheid\n - tijdstip_registratie\n - volgnummer\n - status_historie_code\n - status_historie_waarde\n - kadastrale_gemeente_code\n - kadastrale_gemeente_waarde\n - sectie\n - akr_kadastrale_gemeente_code_code\n - akr_kadastrale_gemeente_code_waarde\n - kadastrale_grootte_waarde\n - soort_grootte_code\n - soort_grootte_waarde\n - perceelnummer\n - perceelnummer_rotatie\n - perceelnummer_verschuiving_delta_x\n - perceelnummer_verschuiving_delta_y\n - perceelnummer_plaatscoordinaat_x\n - perceelnummer_plaatscoordinaat_y\n aliases:\n identificatie_lokaal_id: identificatieLokaalID\n akr_kadastrale_gemeente_code_code: AKRKadastraleGemeenteCodeCode\n akr_kadastrale_gemeente_code_waarde: AKRKadastraleGemeenteCodeWaarde\n - name: Label\n visible: true\n group: Perceel\n title: Label\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaarvisualisatie van het label.\n visualization: label.style\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaarvisualisatie van het label.\n visualization: label.group.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: label_kwaliteit.style\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: label_kwaliteit.group.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: label_print.style\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: label_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/perceel_label.gpkg\n table: perceel_label\n geometryType: Point\n columns:\n - perceel_id\n - perceelnummer\n - rotatie\n - verschuiving_delta_x\n - verschuiving_delta_y\n aliases:\n perceel_id: perceelID\n - name: Bijpijling\n visible: true\n group: Perceel\n title: Bijpijling\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bijpijling.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bijpijling_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bijpijling_print.style\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bijpijling.group.style\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bijpijling_kwaliteit.group.style\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bijpijling_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/perceel_bijpijling.gpkg\n table: perceel_bijpijling\n geometryType: LineString\n columns:\n - perceel_id\n aliases:\n perceel_id: perceelID\n - name: KadastraleGrens\n visible: true\n group: Kadastralekaart\n title: KadastraleGrens\n abstract: Een Kadastrale Grens is de weergave van een grens op de kadastrale kaart die door de dienst van het Kadaster tussen percelen (voorlopig) vastgesteld wordt, op basis van inlichtingen van belanghebbenden en met gebruikmaking van de aan de kadastrale kaart ten grondslag liggende bescheiden die in elk geval de landmeetkundige gegevens bevatten van hetgeen op die kaart wordt weergegeven.\n keywords:\n - Grens\n - Kadastrale grenzen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: kadastralegrens.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: kadastralegrens_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: kadastralegrens_print.style\n - name: standaard:kadastralegrens\n title: Standaardvisualisatie KadastraleGrens\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: kadastralegrens.group.style\n - name: kwaliteit:kadastralegrens\n title: Kwaliteitsvisualisatie KadastraleGrens\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: kadastralegrens_kwaliteit.group.style\n - name: print:kadastralegrens\n title: Printvisualisatie KadastraleGrens\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: kadastralegrens_print.group.style\n data:\n gpkg:\n blobKey: ${BLOBS_GEOPACKAGES_BUCKET}/kadaster/kadastralekaart_brk/${GPKG_VERSION}/kadastrale_grens.gpkg\n table: kadastrale_grens\n geometryType: LineString\n columns:\n - begin_geldigheid\n - tijdstip_registratie\n - volgnummer\n - status_historie_code\n - status_historie_waarde\n - identificatie_namespace\n - identificatie_lokaal_id\n - type_grens_code\n - type_grens_waarde\n - classificatie_kwaliteit_code\n - classificatie_kwaliteit_waarde\n - perceel_links_identificatie_namespace\n - perceel_links_identificatie_lokaal_id\n - perceel_rechts_identificatie_namespace\n - perceel_rechts_identificatie_lokaal_id\n aliases:\n identificatie_lokaal_id: identificatieLokaalID\n perceel_links_identificatie_lokaal_id: perceelLinksIdentificatieLokaalID\n perceel_rechts_identificatie_lokaal_id: perceelRechtsIdentificatieLokaalID\n classificatie_kwaliteit_code: ClassificatieKwaliteitCode\n classificatie_kwaliteit_waarde: ClassificatieKwaliteitWaarde\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) configMapData := GetConfigMapData(&wms) diff --git a/internal/controller/legendgenerator/mapper.go b/internal/controller/legendgenerator/mapper.go index 270c7dc..e3f9be0 100644 --- a/internal/controller/legendgenerator/mapper.go +++ b/internal/controller/legendgenerator/mapper.go @@ -35,7 +35,7 @@ func addLayerInput(wms *pdoknlv3.WMS, data map[string]string) { legendReferences := make([]LegendReference, 0) if wms.Spec.Service.Layer.Layers != nil { - for _, layer := range *wms.Spec.Service.Layer.Layers { + for _, layer := range wms.Spec.Service.Layer.Layers { processLayer(&layer, &legendReferences) } } @@ -67,7 +67,7 @@ func processLayer(layer *pdoknlv3.Layer, legendReferences *[]LegendReference) { } if layer.Layers != nil { - for _, innerLayer := range *layer.Layers { + for _, innerLayer := range layer.Layers { processLayer(&innerLayer, legendReferences) } } @@ -87,7 +87,7 @@ func addLegendFixerConfig(wms *pdoknlv3.WMS, data map[string]string) { if topLayer.Layers != nil { // These layers are called 'middle layers' in the old operator - for _, layer := range *wms.Spec.Service.Layer.Layers { + for _, layer := range wms.Spec.Service.Layer.Layers { for _, style := range layer.Styles { if topLevelStyleNames[style.Name] && style.Legend == nil { legendReferences = append(legendReferences, LegendReference{ @@ -114,7 +114,7 @@ func addLegendFixerConfig(wms *pdoknlv3.WMS, data map[string]string) { getAllNestedNonGroupLayerNames(&topLayer, &targetArray) groupLayers[*layerName] = targetArray - for _, subLayer := range *topLayer.Layers { + for _, subLayer := range topLayer.Layers { if subLayer.IsGroupLayer() { layerName = subLayer.Name targetArray = make([]string, 0) @@ -130,7 +130,7 @@ func addLegendFixerConfig(wms *pdoknlv3.WMS, data map[string]string) { } func getAllNestedNonGroupLayerNames(layer *pdoknlv3.Layer, target *[]string) { - for _, subLayer := range *layer.Layers { + for _, subLayer := range layer.Layers { if subLayer.IsGroupLayer() { getAllNestedNonGroupLayerNames(&subLayer, target) } else { diff --git a/internal/controller/mapfilegenerator/mapfile_generator_test.go b/internal/controller/mapfilegenerator/mapfile_generator_test.go index ea1be94..47878ab 100644 --- a/internal/controller/mapfilegenerator/mapfile_generator_test.go +++ b/internal/controller/mapfilegenerator/mapfile_generator_test.go @@ -254,11 +254,11 @@ func TestGetConfigForWMSWithNoGroupLayers(t *testing.T) { //nolint:misspell v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: rws-nwbwegen-v1-0\n labels:\n dataset-owner: rws\n dataset: nwbwegen\n service-version: v1_0\n service-type: wms\n annotations:\n lifecycle-phase: prod\n service-bundle-id: b39c152b-393b-52f5-a50c-e1ffe904b6fb\nspec:\n general:\n datasetOwner: rws\n dataset: nwbwegen\n serviceVersion: v1_0\n kubernetes:\n healthCheck:\n boundingbox: 135134.89,457152.55,135416.03,457187.82\n resources:\n limits:\n ephemeralStorage: 1535Mi\n memory: 4G\n requests:\n cpu: 2000m\n ephemeralStorage: 1535Mi\n memory: 4G\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n service:\n title: NWB - Wegen WMS\n abstract:\n Dit is de web map service van het Nationaal Wegen Bestand (NWB) - wegen.\n Deze dataset bevat alleen de wegvakken en hectometerpunten. Het Nationaal Wegen\n Bestand - Wegen is een digitaal geografisch bestand van alle wegen in Nederland.\n Opgenomen zijn alle wegen die worden beheerd door wegbeheerders als het Rijk,\n provincies, gemeenten en waterschappen, echter alleen voor zover deze zijn voorzien\n van een straatnaam of nummer.\n authority:\n name: rws\n url: https://www.rijkswaterstaat.nl\n dataEPSG: EPSG:28992\n extent: -59188.44333693248 304984.64144318487 308126.88473339565 858328.516489961\n inspire: true\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n - Hectometerpunten\n - HVD\n - Mobiliteit\n stylingAssets:\n configMapRefs:\n - name: includes\n keys:\n - nwb_wegen_hectopunten.symbol\n - hectopunten.style\n - wegvakken.style\n blobKeys:\n - resources/fonts/liberation-sans.ttf\n layers:\n - abstract:\n Deze laag bevat de wegvakken uit het Nationaal Wegen bestand (NWB)\n en geeft gedetailleerde informatie per wegvak zoals straatnaam, wegnummer,\n routenummer, wegbeheerder, huisnummers, enz. weer.\n data:\n gpkg:\n columns:\n - objectid\n - wvk_id\n - wvk_begdat\n - jte_id_beg\n - jte_id_end\n - wegbehsrt\n - wegnummer\n - wegdeelltr\n - hecto_lttr\n - bst_code\n - rpe_code\n - admrichtng\n - rijrichtng\n - stt_naam\n - stt_bron\n - wpsnaam\n - gme_id\n - gme_naam\n - hnrstrlnks\n - hnrstrrhts\n - e_hnr_lnks\n - e_hnr_rhts\n - l_hnr_lnks\n - l_hnr_rhts\n - begafstand\n - endafstand\n - beginkm\n - eindkm\n - pos_tv_wol\n - wegbehcode\n - wegbehnaam\n - distrcode\n - distrnaam\n - dienstcode\n - dienstnaam\n - wegtype\n - wgtype_oms\n - routeltr\n - routenr\n - routeltr2\n - routenr2\n - routeltr3\n - routenr3\n - routeltr4\n - routenr4\n - wegnr_aw\n - wegnr_hmp\n - geobron_id\n - geobron_nm\n - bronjaar\n - openlr\n - bag_orl\n - frc\n - fow\n - alt_naam\n - alt_nr\n - rel_hoogte\n - st_lengthshape\n geometryType: MultiLineString\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: wegvakken\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Wegvakken\n maxScale: 50000.0\n minScale: 1.0\n name: wegvakken\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: wegvakken\n title: NWB - Wegvakken\n visualization: wegvakken.style\n title: Wegvakken\n visible: true\n - abstract:\n Deze laag bevat de hectopunten uit het Nationaal Wegen Bestand (NWB)\n en geeft gedetailleerde informatie per hectopunt zoals hectometrering, afstand,\n zijde en hectoletter weer.\n data:\n gpkg:\n columns:\n - objectid\n - hectomtrng\n - afstand\n - wvk_id\n - wvk_begdat\n - zijde\n - hecto_lttr\n geometryType: MultiPoint\n blobKey: geopackages/rws/nwbwegen/410a6d1e-e767-41b4-ba8d-9e1e955dd013/1/nwb_wegen.gpkg\n table: hectopunten\n datasetMetadataIdentifier: a9b7026e-0a81-4813-93bd-ba49e6f28502\n keywords:\n - Vervoersnetwerken\n - Menselijke gezondheid en veiligheid\n - Geluidsbelasting hoofdwegen (Richtlijn Omgevingslawaai)\n - Nationaal\n - Voertuigen\n - Verkeer\n - Hectometerpunten\n maxScale: 50000.0\n minScale: 1.0\n name: hectopunten\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\n styles:\n - name: hectopunten\n title: NWB - Hectopunten\n visualization: hectopunten.style\n title: Hectopunten\n visible: true\n metadataIdentifier: f2437a92-ddd3-4777-a1bc-fdf4b4a7fcb8\n" - var v2wms v2beta1.WMS + v2wms := &v2beta1.WMS{} err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) pdoknlv3.SetHost("https://service.pdok.nl") @@ -280,11 +280,11 @@ func TestGetConfigForWMSWithGroupLayers(t *testing.T) { //nolint:misspell v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: hwh-hydrografie-v2-0\n labels:\n dataset-owner: hwh\n dataset: hydrografie\n service-version: v2_0\n service-type: wms\n annotations:\n lifecycle-phase: prod\n service-bundle-id: d30bdf62-1c12-45a5-a57d-367e642ef118\nspec:\n general:\n datasetOwner: hwh\n dataset: hydrografie\n serviceVersion: v2_0\n kubernetes:\n resources:\n limits:\n ephemeralStorage: 1544Mi\n requests:\n ephemeralStorage: 1544Mi\n service:\n title: Waterschappen Hydrografie (INSPIRE geharmoniseerd) WMS\n abstract:\n \"Deze dataset is gebaseerd op (niet geharmoniseerde) data van alle waterschappen\n in Nederland conform INSPIRE. De dataset bevat de volgende INSPIRE objecten:\n CrossingLine, CrossingPoint, DamOrWeir, DrainageBasin, Embankment, Lock, Sluice,\n Watercourse.\"\n authority:\n name: hwh\n url: https://www.hetwaterschapshuis.nl/\n dataEPSG: EPSG:28992\n extent: -59188.44333693248 304984.64144318487 308126.88473339565 858328.516489961\n inspire: true\n keywords:\n - Aquaduct\n - Brug\n - Duikersifonhevel\n - Stuw\n - Vastedam\n - AfvoerAanvoergebied\n - Waterkering\n - Sluis\n - HydroObject\n - HVD\n - Aardobservatie en milieu\n metadataIdentifier: 871a58f8-c9f1-41a4-be37-0f059e0f886f\n stylingAssets:\n configMapRefs:\n - name: includes\n keys:\n - bridge.symbol\n - x.symbol\n blobKeys:\n - resources/images/hwh/hydrografie/bridge.png\n layers:\n - abstract: Watercourse\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Waterbody.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - delineationknown\n - endlifespanversion\n - length\n - level\n - localid\n - localtype\n - name\n - namespace\n - origin\n - persistence\n - streamorder\n - tidal\n - widthrange\n geometryType: MultiLineString\n table: watercourse\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n keywords:\n - Hydroobject\n - Waterbody\n - Watercourse\n - River\n - Stream\n - Lake\n - Reservoir\n name: HY.PhysicalWaters.Waterbodies\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.Waterbodies.Default\n title: Water bodies default style\n visualization: watercourse.style\n title: Waterbody\n maxScale: 50000.0\n minScale: 1.0\n visible: true\n - abstract: Drainage basin\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Catchment.gpkg\n columns:\n - gml_id\n - area\n - beginlifespanversion\n - endlifespanversion\n - localid\n - name\n - namespace\n - order\n - orderscheme\n - origin\n - outlet\n - scope\n geometryType: MultiPolygon\n table: drainagebasin\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n keywords:\n - AfvoergebiedAanvoergebied\n - Catchment\n - Basin\n - Catchment Area\n - Drainage basin\n name: HY.PhysicalWaters.Catchments\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.Catchments.Default\n title: Drainage Basin default style\n visualization: drainagebasin.style\n title: Catchment\n maxScale: 50000.0\n minScale: 1.0\n visible: true\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis\n - Bridge\n - Aquaduct\n - Dam\n - Weir\n - Lock\n - Ford\n - Dyke\n maxScale: 50000.0\n minScale: 1.0\n name: HY.PhysicalWaters.ManMadeObject\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Man-made objects default style\n title: Man-made Object\n visible: true\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Man-madeObject.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - endlifespanversion\n - localid\n - name\n - namespace\n geometryType: Point\n table: lock\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n group: HY.PhysicalWaters.ManMadeObject\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis.\n name: HY.PhysicalWaters.ManMadeObject.lock\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Lock\n visualization: lock.style\n title: Man-made Object\n maxScale: 50000.0\n minScale: 1.0\n visible: false\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Man-madeObject.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - endlifespanversion\n - localid\n - name\n - namespace\n - type\n geometryType: Point\n table: crossingpoint\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n group: HY.PhysicalWaters.ManMadeObject\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis.\n name: HY.PhysicalWaters.ManMadeObject.crossingpoint\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Crossing Point\n visualization: crossingpoint.style\n title: Man-made Object\n maxScale: 50000.0\n minScale: 1.0\n visible: false\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Man-madeObject.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - endlifespanversion\n - localid\n - name\n - namespace\n geometryType: Point\n table: sluice\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n group: HY.PhysicalWaters.ManMadeObject\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis.\n name: HY.PhysicalWaters.ManMadeObject.sluice\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Sluice\n visualization: sluice.style\n title: Man-made Object\n maxScale: 50000.0\n minScale: 1.0\n visible: false\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Man-madeObject.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - endlifespanversion\n - localid\n - name\n - namespace\n geometryType: MultiLineString\n table: embankment\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n group: HY.PhysicalWaters.ManMadeObject\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis.\n name: HY.PhysicalWaters.ManMadeObject.embankment\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Embankment\n visualization: embankment.style\n title: Man-made Object\n maxScale: 50000.0\n minScale: 1.0\n visible: false\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Man-madeObject.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - endlifespanversion\n - localid\n - name\n - namespace\n - type\n geometryType: MultiLineString\n table: crossingline\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n group: HY.PhysicalWaters.ManMadeObject\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis.\n name: HY.PhysicalWaters.ManMadeObject.crossingline\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Crossing Line\n visualization: crossingline.style\n title: Man-made Object\n maxScale: 50000.0\n minScale: 1.0\n visible: false\n - abstract: Crossing line, crossing point, dam or weir, sluice, embankment, lock.\n data:\n gpkg:\n blobKey: geopackages/hwh/hydrografie/aaa/1/Man-madeObject.gpkg\n columns:\n - gml_id\n - beginlifespanversion\n - condition\n - endlifespanversion\n - localid\n - name\n - namespace\n geometryType: Point\n table: damorweir\n datasetMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n group: HY.PhysicalWaters.ManMadeObject\n keywords:\n - Man Made\n - Duikersifonhevel\n - Aquaduct\n - Brug\n - Stuw\n - Vastedam\n - Waterkering\n - Sluis.\n name: HY.PhysicalWaters.ManMadeObject.damorweir\n sourceMetadataIdentifier: 07575774-57a1-4419-bab4-6c88fdeb02b2\n styles:\n - name: HY.PhysicalWaters.ManMadeObject.Default\n title: Dam or Weir\n visualization: damorweir.style\n title: Man-made Object\n maxScale: 50000.0\n minScale: 1.0\n visible: false\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) pdoknlv3.SetHost("https://service.pdok.nl") @@ -306,11 +306,11 @@ func TestGetConfigForWMSWithGroupLayersAndTopGroupLayer(t *testing.T) { //nolint:misspell v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: kadaster-kadastralekaart\n labels:\n dataset-owner: kadaster\n dataset: kadastralekaart\n service-version: v5_0\n service-type: wms\nspec:\n general:\n datasetOwner: kadaster\n dataset: kadastralekaart\n serviceVersion: v5_0\n kubernetes:\n healthCheck:\n querystring: language=dut&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&BBOX=193882.0336615453998,470528.1693874415942,193922.4213813782844,470564.250484353397&CRS=EPSG:28992&WIDTH=769&HEIGHT=687&LAYERS=OpenbareRuimteNaam,Bebouwing,Perceel,KadastraleGrens&FORMAT=image/png&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE\n mimetype: image/png\n resources:\n limits:\n memory: \"103M\"\n ephemeralStorage: \"104M\"\n requests:\n cpu: \"1001\"\n memory: \"101M\"\n ephemeralStorage: \"102M\"\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n rewriteGroupToDataLayers: true\n service:\n inspire: false\n title: Kadastrale Kaart (WMS)\n abstract: Overzicht van de ligging van de kadastrale percelen in Nederland. Fungeert als schakel tussen terrein en registratie, vervult voor externe gebruiker vaak een referentiefunctie, een ondergrond ten opzichte waarvan de gebruiker eigen informatie kan vastleggen en presenteren.\n keywords:\n - Kadaster\n - Kadastrale percelen\n - Kadastrale grens\n - Kadastrale kaart\n - Bebouwing\n - Nummeraanduidingreeks\n - Openbare ruimte naam\n - Perceel\n - Grens\n - Kwaliteit\n - Kwaliteitslabels\n - HVD\n - Geospatiale data\n metadataIdentifier: 97cf6a64-9cfc-4ce6-9741-2db44fd27fca\n authority:\n name: kadaster\n url: https://www.kadaster.nl\n dataEPSG: EPSG:28992\n resolution: 91\n defResolution: 91\n extent: \"-25000 250000 280000 860000\"\n maxSize: 10000\n stylingAssets:\n configMapRefs:\n - name: includes\n blobKeys:\n - resources/fonts/liberation-sans.ttf\n - resources/fonts/liberation-sans-italic.ttf\n layers:\n - name: Kadastralekaart\n title: KadastraleKaartv5\n abstract: Overzicht van de ligging van de kadastrale percelen in Nederland. Fungeert als schakel tussen terrein en registratie, vervult voor externe gebruiker vaak een referentiefunctie, een ondergrond ten opzichte waarvan de gebruiker eigen informatie kan vastleggen en presenteren.\n maxScale: 6001\n keywords:\n - Kadaster\n - Kadastrale percelen\n - Kadastrale grens\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n - name: Bebouwing\n visible: true\n group: Kadastralekaart\n title: Bebouwing\n abstract: De laag Bebouwing is een selectie op panden van de BGT.\n keywords:\n - Bebouwing\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard:bebouwing\n title: Standaardvisualisatie Bebouwing\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n - name: kwaliteit:bebouwing\n title: Kwaliteitsvisualisatie Bebouwing\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n - name: print:bebouwing\n title: Printvisualisatie Bebouwing\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n - name: Bebouwingvlak\n visible: true\n group: Bebouwing\n title: Bebouwingvlak\n abstract: De laag Bebouwing is een selectie op panden van de BGT.\n keywords:\n - Bebouwing\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bebouwing.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bebouwing_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bebouwing_print.style\n - name: standaard:bebouwing\n title: Standaardvisualisatie Bebouwing\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bebouwing.group.style\n - name: kwaliteit:bebouwing\n title: Kwaliteitsvisualisatie Bebouwing\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bebouwing_kwaliteit.group.style\n - name: print:bebouwing\n title: Printvisualisatie Bebouwing\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bebouwing_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/pand.gpkg\n table: pand\n geometryType: Polygon\n columns:\n - object_begin_tijd\n - lv_publicatiedatum\n - relatieve_hoogteligging\n - in_onderzoek\n - tijdstip_registratie\n - identificatie_namespace\n - identificatie_lokaal_id\n - bronhouder\n - bgt_status\n - plus_status\n - identificatie_bag_pnd\n aliases:\n lv_publicatiedatum: LV-publicatiedatum\n identificatie_lokaal_id: identificatieLokaalID\n identificatie_bag_pnd: identificatieBAGPND\n bgt_status: bgt-status\n plus_status: plus-status\n - name: Nummeraanduidingreeks\n visible: true\n group: Bebouwing\n title: Nummeraanduidingreeks\n abstract: De laag Bebouwing is een selectie op panden van de BGT.\n keywords:\n - Nummeraanduidingreeks\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 2001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaarvisualisatie van de nummeraanduidingreeks.\n visualization: nummeraanduidingreeks.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: nummeraanduidingreeks_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: nummeraanduidingreeks_print.style\n - name: standaard:bebouwing\n title: Standaardvisualisatie Bebouwing\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: nummeraanduidingreeks.group.style\n - name: kwaliteit:bebouwing\n title: Kwaliteitsvisualisatie Bebouwing\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: nummeraanduidingreeks_kwaliteit.group.style\n - name: print:bebouwing\n title: Printvisualisatie Bebouwing\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: nummeraanduidingreeks_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/pand_nummeraanduiding.gpkg\n table: pand_nummeraanduiding\n geometryType: Point\n columns:\n - bebouwing_id\n - hoek\n - tekst\n - bag_vbo_laagste_huisnummer\n - bag_vbo_hoogste_huisnummer\n - hoek\n aliases:\n bebouwing_id: bebouwingID\n bag_vbo_laagste_huisnummer: identificatie_BAGVBOLaagsteHuisnummer\n bag_vbo_hoogste_huisnummer: identificatie_BAGVBOHoogsteHuisnummer\n - name: OpenbareRuimteNaam\n visible: true\n group: Kadastralekaart\n title: OpenbareRuimteNaam\n abstract: De laag Openbareruimtenaam is een selectie op de openbare ruimte labels van de BGT met een bgt-status \"bestaand\" die een classificatie (openbareruimtetype) Weg en Water hebben.\n keywords:\n - Openbare ruimte naam\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 2001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: openbareruimtenaam.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: openbareruimtenaam_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: openbareruimtenaam_print.style\n - name: standaard:openbareruimtenaam\n title: Standaardvisualisatie OpenbareRuimteNaam\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: openbareruimtenaam.group.style\n - name: kwaliteit:openbareruimtenaam\n title: Kwaliteitsvisualisatie OpenbareRuimteNaam\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: openbareruimtenaam_kwaliteit.group.style\n - name: print:openbareruimtenaam\n title: Printvisualisatie OpenbareRuimteNaam\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: openbareruimtenaam_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/openbareruimtelabel.gpkg\n table: openbareruimtelabel\n geometryType: Point\n columns:\n - object_begin_tijd\n - lv_publicatiedatum\n - relatieve_hoogteligging\n - in_onderzoek\n - tijdstip_registratie\n - identificatie_namespace\n - identificatie_lokaal_id\n - bronhouder\n - bgt_status\n - plus_status\n - identificatie_bag_opr\n - tekst\n - hoek\n - openbare_ruimte_type\n aliases:\n lv_publicatiedatum: LV-publicatiedatum\n identificatie_lokaal_id: identificatieLokaalID\n identificatie_bag_opr: identificatieBAGOPR\n bgt_status: bgt-status\n plus_status: plus-status\n - name: Perceel\n visible: true\n group: Kadastralekaart\n title: Perceel\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Perceel\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n - name: Perceelvlak\n visible: true\n group: Perceel\n title: Perceelvlak\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: perceelvlak.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: perceelvlak_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: perceelvlak_print.style\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: perceelvlak.group.style\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: perceelvlak_kwaliteit.group.style\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: perceelvlak_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/perceel.gpkg\n table: perceel\n geometryType: Polygon\n columns:\n - identificatie_namespace\n - identificatie_lokaal_id\n - begin_geldigheid\n - tijdstip_registratie\n - volgnummer\n - status_historie_code\n - status_historie_waarde\n - kadastrale_gemeente_code\n - kadastrale_gemeente_waarde\n - sectie\n - akr_kadastrale_gemeente_code_code\n - akr_kadastrale_gemeente_code_waarde\n - kadastrale_grootte_waarde\n - soort_grootte_code\n - soort_grootte_waarde\n - perceelnummer\n - perceelnummer_rotatie\n - perceelnummer_verschuiving_delta_x\n - perceelnummer_verschuiving_delta_y\n - perceelnummer_plaatscoordinaat_x\n - perceelnummer_plaatscoordinaat_y\n aliases:\n identificatie_lokaal_id: identificatieLokaalID\n akr_kadastrale_gemeente_code_code: AKRKadastraleGemeenteCodeCode\n akr_kadastrale_gemeente_code_waarde: AKRKadastraleGemeenteCodeWaarde\n - name: Label\n visible: true\n group: Perceel\n title: Label\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaarvisualisatie van het label.\n visualization: label.style\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaarvisualisatie van het label.\n visualization: label.group.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: label_kwaliteit.style\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: label_kwaliteit.group.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: label_print.style\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: label_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/perceel_label.gpkg\n table: perceel_label\n geometryType: Point\n columns:\n - perceel_id\n - perceelnummer\n - rotatie\n - verschuiving_delta_x\n - verschuiving_delta_y\n aliases:\n perceel_id: perceelID\n - name: Bijpijling\n visible: true\n group: Perceel\n title: Bijpijling\n abstract: Een perceel is een stuk grond waarvan het Kadaster de grenzen heeft gemeten of gaat meten en dat bij het Kadaster een eigen nummer heeft. Een perceel is een begrensd deel van het Nederlands grondgebied dat kadastraal geïdentificeerd is en met kadastrale grenzen begrensd is.\n keywords:\n - Kadastrale percelen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bijpijling.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bijpijling_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bijpijling_print.style\n - name: standaard:perceel\n title: Standaardvisualisatie Perceel\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: bijpijling.group.style\n - name: kwaliteit:perceel\n title: Kwaliteitsvisualisatie Perceel\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: bijpijling_kwaliteit.group.style\n - name: print:perceel\n title: Printvisualisatie Perceel\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: bijpijling_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/perceel_bijpijling.gpkg\n table: perceel_bijpijling\n geometryType: LineString\n columns:\n - perceel_id\n aliases:\n perceel_id: perceelID\n - name: KadastraleGrens\n visible: true\n group: Kadastralekaart\n title: KadastraleGrens\n abstract: Een Kadastrale Grens is de weergave van een grens op de kadastrale kaart die door de dienst van het Kadaster tussen percelen (voorlopig) vastgesteld wordt, op basis van inlichtingen van belanghebbenden en met gebruikmaking van de aan de kadastrale kaart ten grondslag liggende bescheiden die in elk geval de landmeetkundige gegevens bevatten van hetgeen op die kaart wordt weergegeven.\n keywords:\n - Grens\n - Kadastrale grenzen\n datasetMetadataIdentifier: a29917b9-3426-4041-a11b-69bcb2256904\n sourceMetadataIdentifier: 06b6c650-cdb1-11dd-ad8b-0800200c9a64\n minScale: 50\n maxScale: 6001\n styles:\n - name: standaard\n title: Standaardvisualisatie\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: kadastralegrens.style\n - name: kwaliteit\n title: Kwaliteitsvisualisatie\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: kadastralegrens_kwaliteit.style\n - name: print\n title: Printvisualisatie\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: kadastralegrens_print.style\n - name: standaard:kadastralegrens\n title: Standaardvisualisatie KadastraleGrens\n abstract: Standaardvisualisatie met grenzen op basis van type (definitief, voorlopig of administratief).\n visualization: kadastralegrens.group.style\n - name: kwaliteit:kadastralegrens\n title: Kwaliteitsvisualisatie KadastraleGrens\n abstract: Kwaliteitsvisualisatie met grenzen op basis van kwaliteitsklasse (B, C, D of E).\n visualization: kadastralegrens_kwaliteit.group.style\n - name: print:kadastralegrens\n title: Printvisualisatie KadastraleGrens\n abstract: Visualisatie ten behoeve van afdrukken op 180 dpi.\n visualization: kadastralegrens_print.group.style\n data:\n gpkg:\n blobKey: geopackages/kadaster/kadastralekaart_brk/aaa/1/kadastrale_grens.gpkg\n table: kadastrale_grens\n geometryType: LineString\n columns:\n - begin_geldigheid\n - tijdstip_registratie\n - volgnummer\n - status_historie_code\n - status_historie_waarde\n - identificatie_namespace\n - identificatie_lokaal_id\n - type_grens_code\n - type_grens_waarde\n - classificatie_kwaliteit_code\n - classificatie_kwaliteit_waarde\n - perceel_links_identificatie_namespace\n - perceel_links_identificatie_lokaal_id\n - perceel_rechts_identificatie_namespace\n - perceel_rechts_identificatie_lokaal_id\n aliases:\n identificatie_lokaal_id: identificatieLokaalID\n perceel_links_identificatie_lokaal_id: perceelLinksIdentificatieLokaalID\n perceel_rechts_identificatie_lokaal_id: perceelRechtsIdentificatieLokaalID\n classificatie_kwaliteit_code: ClassificatieKwaliteitCode\n classificatie_kwaliteit_waarde: ClassificatieKwaliteitWaarde\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) pdoknlv3.SetHost("https://service.pdok.nl") @@ -331,11 +331,11 @@ func TestGetConfigForTifWMS(t *testing.T) { } v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: bzk-luchtfotolabels-v1-0\n labels:\n dataset-owner: bzk\n dataset: luchtfotolabels\n service-version: v1_0\n service-type: wms\nspec:\n general:\n datasetOwner: bzk\n dataset: luchtfotolabels\n serviceVersion: v1_0\n kubernetes:\n autoscaling:\n minReplicas: 1\n maxReplicas: 2\n healthCheck:\n boundingbox: 135036.1077132325445,456913.9317436855054,135531.2729437439411,457377.1306112145539\n resources:\n limits:\n memory: 4G\n ephemeralStorage: 6G\n requests:\n cpu: \"1\"\n memory: 4G\n ephemeralStorage: 6G\n options:\n automaticCasing: false\n disableWebserviceProxy: false\n includeIngress: false\n validateRequests: false\n validateChildStyleNameEqual: false\n service:\n inspire: false\n title: Luchtfoto Labels WMS\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n metadataIdentifier: 70562932-e7dc-4ba2-ba4f-05863d02587c\n authority:\n name: kadaster\n url: http://www.kadaster.nl\n dataEPSG: EPSG:28992\n stylingAssets:\n configMapRefs:\n - name: ${INCLUDES}\n layers:\n - name: lufolabels\n visible: true\n title: Luchtfoto labels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n - name: luchtfotoroads_100pixkm\n visible: true\n title: Luchtfoto roads 100pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 24001\n maxScale: 48001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: roads.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/100pixkm_luforoads/100pixkm_luforoads.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotoroads_200pixkm\n visible: true\n title: Luchtfoto roads 200pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 12001\n maxScale: 24001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: roads.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/200pixkm_luforoads/200pixkm_luforoads.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotoroads_400pixkm\n visible: true\n title: Luchtfoto roads 400pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 6001\n maxScale: 12001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: roads.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/400pixkm_luforoads/400pixkm_luforoads.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotoroads_800pixkm\n visible: true\n title: Luchtfoto roads 800pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 3001\n maxScale: 6001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: roads.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/800pixkm_luforoads/800pixkm_luforoads.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotoroads_1600pixkm\n visible: true\n title: Luchtfoto roads 1600pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 1501\n maxScale: 3001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: roads.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/1600pixkm_luforoads/1600pixkm_luforoads.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotolabels_100pixkm\n visible: true\n title: Luchtfoto labels 100pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 24001\n maxScale: 48001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: labels.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/100pixkm_lufolabels/100pixkm_lufolabels.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotolabels_200pixkm\n visible: true\n title: Luchtfoto labels 200pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 12001\n maxScale: 24001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: labels.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/200pixkm_lufolabels/200pixkm_lufolabels.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotolabels_400pixkm\n visible: true\n title: Luchtfoto labels 400pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 6001\n maxScale: 12001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: labels.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/400pixkm_lufolabels/400pixkm_lufolabels.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotolabels_800pixkm\n visible: true\n title: Luchtfoto labels 800pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 3001\n maxScale: 6001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: labels.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/800pixkm_lufolabels/800pixkm_lufolabels.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotolabels_1600pixkm\n visible: true\n title: Luchtfoto labels 1600pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n minScale: 1501\n maxScale: 3001\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: labels.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/1600pixkm_lufolabels/1600pixkm_lufolabels.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n - name: luchtfotolabels_3200pixkm\n visible: true\n title: Luchtfoto labels 3200pixkm\n group: lufolabels\n abstract: \"De luchtfoto labels bestaan uit weglabels en wegassen en kunnen worden gebruikt als laag (overlay) op onder andere de PDOK luchtfoto.\"\n keywords:\n - bzk\n - luchtfotolabels\n datasetMetadataIdentifier: 6ca22f53-b072-42f4-b920-104c7c83cd28\n sourceMetadataIdentifier: 901647c2-802d-11e6-ae22-56b6b6499611\n maxScale: 1501\n styles:\n - name: luchtfotolabels\n title: Luchtfotolabels\n visualization: labels.style\n data:\n tif:\n blobKey: tifs/bzk/luchtfotolabels/${GPKG_VERSION}/3200pixkm_lufolabels/3200pixkm_lufolabels.vrt\n offsite: \"#978E97\"\n resample: BILINEAR\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) pdoknlv3.SetHost("https://service.pdok.nl") @@ -356,11 +356,11 @@ func TestGetConfigForPostgisWMS(t *testing.T) { } v2wmsstring := "apiVersion: pdok.nl/v2beta1\nkind: WMS\nmetadata:\n name: v1-0 # name set with namePrefix in base/kustomization.yaml\n labels:\n dataset: terugmeldingen\n dataset-owner: brt\n service-version: v1_0\n service-type: wms\nspec:\n general:\n datasetOwner: brt\n dataset: terugmeldingen\n serviceVersion: v1_0\n kubernetes:\n resources:\n limits:\n ephemeralStorage: 20Mi\n options:\n automaticCasing: true\n disableWebserviceProxy: false\n includeIngress: true\n validateRequests: true\n service:\n inspire: false\n title: BRT Terugmeldingen WMS\n abstract: De BRT terugmeldingenservice bevat alle recente meldingen op BRT objecten waar twijfel over de juistheid bestaat. Zowel terugmeldingen op de TOP10 als meldingen die gemaakt zijn op de gegeneraliseerde kaartproducten (TOP25, TOP50, TOP100, TOP250) worden hierin geregistreerd. Daarnaast kan je de inhoud en status van de meldingen inzien. Ook een vermoedelijke fout geconstateerd? Doe een melding op https://verbeterdekaart.kadaster.nl\n keywords:\n - Basisregistratie Topografie\n - BRT\n - terugmeldingen\n - TOP10NL\n - TOP25\n - TOP50\n - TOP100\n - TOP250\n - in onderzoek register\n - verbeter de kaart\n - verbeterdekaart\n metadataIdentifier: fa069f74-9837-4d63-b2ac-b337b5de86b1\n authority:\n name: brt\n url: http://www.brt.nl\n dataEPSG: EPSG:28992\n extent: -7000 289000 300000 629000\n stylingAssets:\n configMapRefs:\n - name: includes\n keys:\n - terugmeldingen.symbol\n - terugmeldingen.style\n blobKeys:\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/afgerond-blauw.png\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/afgewezen-rood.png\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/doorgestuurd-grijs.png\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/geparkeerd-kobaltblauw.png\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/goedgekeurd-groen.png\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/nieuw-geel.png\n - ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/onderzoek-oranje.png\n layers:\n - name: brtterugmeldingen\n visible: true\n title: BRT Terugmeldingen\n abstract: Alle recente BRT terugmeldingen gedaan door BRT gebruikers.\n keywords:\n - brtterugmeldingen\n datasetMetadataIdentifier: 7a84c4de-4ec0-4202-a8d0-792fb7d39d1f\n sourceMetadataIdentifier: 07c7d650-cdb1-11dd-ad8b-0800200c9a60\n styles:\n - title: Terugmeldingen\n name: brtterugmeldingen:terugmeldingen\n visualization: terugmeldingen.style\n legendFile:\n blobKey: ${BLOBS_RESOURCES_BUCKET}/images/terugmeldingen/terugmeldingen-legend.png\n data:\n postgis:\n table: brtterugmeldingen.brtterugmeldingen_v1\n geometryType: Point\n columns:\n - meldingsnummer_volledig\n - tijdstip_registratie\n - status\n - omschrijving\n - bronhoudercode\n - bronhoudernaam\n - tijdstip_statuswijziging\n - toelichting\n - objectid\n - objecttype\n - hoogte_vanaf_maaiveld\n" - var v2wms v2beta1.WMS - err := yaml.Unmarshal([]byte(v2wmsstring), &v2wms) + v2wms := &v2beta1.WMS{} + err := yaml.Unmarshal([]byte(v2wmsstring), v2wms) assert.NoError(t, err) var wms pdoknlv3.WMS - v2beta1.V3HubFromV2(&v2wms, &wms) + v2wms.ToV3(&wms) pdoknlv3.SetHost("https://service.pdok.nl") diff --git a/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy.go b/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy.go index c027d59..3a29b35 100644 --- a/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy.go +++ b/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy.go @@ -69,7 +69,7 @@ func MapWMSToOgcWebserviceProxyConfig(wms *pdoknlv3.WMS) (config Config, err err // TODO Should there be a distinction between grouplayers and the toplayer? if layer.IsGroupLayer() { var dataLayers []string - for _, childLayer := range *layer.Layers { + for _, childLayer := range layer.Layers { if childLayer.IsDataLayer() { dataLayers = append(dataLayers, *childLayer.Name) } diff --git a/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy_test.go b/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy_test.go index 28a1771..05715b2 100644 --- a/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy_test.go +++ b/internal/controller/ogcwebserviceproxy/ogc_webservice_proxy_test.go @@ -33,10 +33,10 @@ func TestGetConfig(t *testing.T) { Service: pdoknlv3.WMSService{ Layer: pdoknlv3.Layer{ Name: controller.Pointer("toplayer"), - Layers: &[]pdoknlv3.Layer{ + Layers: []pdoknlv3.Layer{ { Name: controller.Pointer("grouplayer-1"), - Layers: &[]pdoknlv3.Layer{ + Layers: []pdoknlv3.Layer{ { Name: controller.Pointer("datalayer-1"), Data: &pdoknlv3.Data{Gpkg: &pdoknlv3.Gpkg{BlobKey: "blob-1"}}, @@ -49,7 +49,7 @@ func TestGetConfig(t *testing.T) { }, { Name: controller.Pointer("grouplayer-2"), - Layers: &[]pdoknlv3.Layer{ + Layers: []pdoknlv3.Layer{ { Name: controller.Pointer("datalayer-3"), Data: &pdoknlv3.Data{Gpkg: &pdoknlv3.Gpkg{BlobKey: "blob-3"}}, diff --git a/internal/controller/suite_test.go b/internal/controller/suite_test.go index 278611f..6eb0beb 100644 --- a/internal/controller/suite_test.go +++ b/internal/controller/suite_test.go @@ -31,6 +31,7 @@ import ( "errors" pdoknlv2beta1 "github.com/pdok/mapserver-operator/api/v2beta1" smoothoperator1 "github.com/pdok/smooth-operator/api/v1" + smoothoperatorvalidation "github.com/pdok/smooth-operator/pkg/validation" traefikiov1alpha1 "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/traefikio/v1alpha1" "golang.org/x/tools/go/packages" v1 "k8s.io/api/core/v1" @@ -145,6 +146,12 @@ var _ = BeforeSuite(func() { } err = k8sClient.Create(ctx, &blobSecret) Expect(err).NotTo(HaveOccurred()) + + // Load CRD schemas + err = smoothoperatorvalidation.LoadSchemasForCRD(cfg, "default", "wfs.pdok.nl") + Expect(err).NotTo(HaveOccurred()) + err = smoothoperatorvalidation.LoadSchemasForCRD(cfg, "default", "wms.pdok.nl") + Expect(err).NotTo(HaveOccurred()) }) var _ = AfterSuite(func() { diff --git a/internal/controller/test_manifests/v3_wfs.yaml b/internal/controller/test_manifests/v3_wfs.yaml index 3282e36..831bfc3 100644 --- a/internal/controller/test_manifests/v3_wfs.yaml +++ b/internal/controller/test_manifests/v3_wfs.yaml @@ -52,7 +52,6 @@ spec: keywords: - keyword1 - keyword2 - accessConstraints: "https://test.com" defaultCrs: "EPSG:28992" bbox: defaultCRS: diff --git a/internal/controller/wfs_controller_test.go b/internal/controller/wfs_controller_test.go index ac55661..69d45de 100644 --- a/internal/controller/wfs_controller_test.go +++ b/internal/controller/wfs_controller_test.go @@ -39,6 +39,7 @@ import ( smoothoperatorv1 "github.com/pdok/smooth-operator/api/v1" smoothoperatorsamples "github.com/pdok/smooth-operator/config/samples" smoothoperatorutils "github.com/pdok/smooth-operator/pkg/util" + smoothoperatorvalidation "github.com/pdok/smooth-operator/pkg/validation" traefikiov1alpha1 "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/traefikio/v1alpha1" v2 "k8s.io/api/autoscaling/v2" v1 "k8s.io/api/core/v1" @@ -680,7 +681,11 @@ var testManifestWFS []byte func getUniqueWFSSample(counter int) (*pdoknlv3.WFS, error) { sample := &pdoknlv3.WFS{} - err := yaml.Unmarshal(testManifestWFS, sample) + defaulted, err := smoothoperatorvalidation.ApplySchemaDefaultsStr(string(testManifestWFS)) + if err != nil { + return nil, err + } + err = yaml.Unmarshal([]byte(defaulted), sample) if err != nil { return nil, err } diff --git a/internal/controller/wms_controller_test.go b/internal/controller/wms_controller_test.go index 5a83a49..68dd29f 100644 --- a/internal/controller/wms_controller_test.go +++ b/internal/controller/wms_controller_test.go @@ -38,6 +38,7 @@ import ( smoothoperatorv1 "github.com/pdok/smooth-operator/api/v1" smoothoperatorsamples "github.com/pdok/smooth-operator/config/samples" smoothoperatorutils "github.com/pdok/smooth-operator/pkg/util" + smoothoperatorvalidation "github.com/pdok/smooth-operator/pkg/validation" traefikiov1alpha1 "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/traefikio/v1alpha1" appsv1 "k8s.io/api/apps/v1" autoscalingv2 "k8s.io/api/autoscaling/v2" @@ -984,7 +985,11 @@ var testManifestWMS []byte func getUniqueWMSSample(counter int) (*pdoknlv3.WMS, error) { sample := &pdoknlv3.WMS{} - err := yaml.Unmarshal(testManifestWMS, sample) + defaulted, err := smoothoperatorvalidation.ApplySchemaDefaultsStr(string(testManifestWMS)) + if err != nil { + return nil, err + } + err = yaml.Unmarshal([]byte(defaulted), sample) if err != nil { return nil, err } diff --git a/internal/webhook/v3/wms_webhook_test.go b/internal/webhook/v3/wms_webhook_test.go index 7c40e7a..ed6704a 100644 --- a/internal/webhook/v3/wms_webhook_test.go +++ b/internal/webhook/v3/wms_webhook_test.go @@ -95,7 +95,7 @@ var _ = Describe("WMS Webhook", func() { }) It("Should deny creation if layer names are not unique", func() { - childLayers := *obj.Spec.Service.Layer.Layers + childLayers := obj.Spec.Service.Layer.Layers secondLayer := childLayers[0] obj.Spec.Service.Layer.Name = secondLayer.Name _, err := validator.ValidateCreate(ctx, obj) @@ -127,24 +127,24 @@ var _ = Describe("WMS Webhook", func() { }) It("Should deny creation if there is a visible layer without a style title", func() { - nestedLayers1 := *obj.Spec.Service.Layer.Layers - nestedLayers2 := *nestedLayers1[0].Layers + nestedLayers1 := obj.Spec.Service.Layer.Layers + nestedLayers2 := nestedLayers1[0].Layers nestedLayers2[0].Styles[0].Title = nil _, err := validator.ValidateCreate(ctx, obj) Expect(err).To(HaveOccurred()) }) It("Should deny creation if layer has parent layer with same style name as child layer", func() { - nestedLayers1 := *obj.Spec.Service.Layer.Layers - nestedLayers2 := *nestedLayers1[0].Layers + nestedLayers1 := obj.Spec.Service.Layer.Layers + nestedLayers2 := nestedLayers1[0].Layers nestedLayers1[0].Styles = []pdoknlv3.Style{{Name: nestedLayers2[0].Styles[0].Name}} _, err := validator.ValidateCreate(ctx, obj) Expect(err).To(HaveOccurred()) }) It("Should deny creation if datalayer has style without visualization but there is no mapfile set", func() { - nestedLayers1 := *obj.Spec.Service.Layer.Layers - nestedLayers2 := *nestedLayers1[0].Layers + nestedLayers1 := obj.Spec.Service.Layer.Layers + nestedLayers2 := nestedLayers1[0].Layers nestedLayers2[0].Styles[0].Visualization = nil _, err := validator.ValidateCreate(ctx, obj) Expect(err).To(HaveOccurred()) @@ -157,21 +157,21 @@ var _ = Describe("WMS Webhook", func() { }) It("Should deny creation if grouplayer is not visible", func() { - nestedLayers1 := *obj.Spec.Service.Layer.Layers + nestedLayers1 := obj.Spec.Service.Layer.Layers nestedLayers1[0].Visible = smoothoperatorutils.Pointer(false) _, err := validator.ValidateCreate(ctx, obj) Expect(err).To(HaveOccurred()) }) It("Should deny creation if grouplayer has data", func() { - nestedLayers1 := *obj.Spec.Service.Layer.Layers + nestedLayers1 := obj.Spec.Service.Layer.Layers nestedLayers1[0].Data = &pdoknlv3.Data{} _, err := validator.ValidateCreate(ctx, obj) Expect(err).To(HaveOccurred()) }) It("Should deny creation if grouplayer has style with visualization", func() { - nestedLayers1 := *obj.Spec.Service.Layer.Layers + nestedLayers1 := obj.Spec.Service.Layer.Layers nestedLayers1[0].Styles = []pdoknlv3.Style{{Visualization: smoothoperatorutils.Pointer("visualization.style")}} _, err := validator.ValidateCreate(ctx, obj) Expect(err).To(HaveOccurred())