Skip to content

Commit 3bf26cd

Browse files
Merge pull request #2 from PDOK/jd/pdok-17794-wms-conversie
WMS conversion
2 parents 944db8a + 833e6eb commit 3bf26cd

16 files changed

+2059
-277
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ help: ## Display this help.
4343

4444
.PHONY: manifests
4545
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
46-
$(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
46+
$(CONTROLLER_GEN) rbac:roleName=manager-role crd:allowDangerousTypes=true webhook paths="./..." output:crd:artifacts:config=config/crd/bases
47+
## allowDangerousTypes=true for v2beta structs
4748

4849
.PHONY: generate
4950
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.

api/v2beta1/shared_conversion.go

Lines changed: 154 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package v2beta1
22

33
import (
44
pdoknlv3 "github.com/pdok/mapserver-operator/api/v3"
5+
shared_model "github.com/pdok/smooth-operator/model"
56
autoscalingv2 "k8s.io/api/autoscaling/v2beta1"
67
corev1 "k8s.io/api/core/v1"
78
)
@@ -10,12 +11,36 @@ func Pointer[T interface{}](val T) *T {
1011
return &val
1112
}
1213

13-
func PointerValWithDefault[T interface{}](ptr *T, defaultValue T) T {
14-
if ptr == nil {
15-
return defaultValue
14+
func PointerVal[T interface{}](val *T, def T) T {
15+
if val == nil {
16+
return def
17+
} else {
18+
return *val
1619
}
20+
}
1721

18-
return *ptr
22+
func ConverseOptionsV2ToV3(src WMSWFSOptions) *pdoknlv3.Options {
23+
return &pdoknlv3.Options{
24+
AutomaticCasing: src.AutomaticCasing,
25+
IncludeIngress: src.IncludeIngress,
26+
PrefetchData: src.PrefetchData,
27+
ValidateRequests: src.ValidateRequests,
28+
RewriteGroupToDataLayers: src.RewriteGroupToDataLayers,
29+
DisableWebserviceProxy: src.DisableWebserviceProxy,
30+
ValidateChildStyleNameEqual: src.ValidateChildStyleNameEqual,
31+
}
32+
}
33+
34+
func ConverseOptionsV3ToV2(src *pdoknlv3.Options) WMSWFSOptions {
35+
return WMSWFSOptions{
36+
AutomaticCasing: src.AutomaticCasing,
37+
PrefetchData: src.PrefetchData,
38+
IncludeIngress: src.IncludeIngress,
39+
ValidateRequests: src.ValidateRequests,
40+
RewriteGroupToDataLayers: src.RewriteGroupToDataLayers,
41+
DisableWebserviceProxy: src.DisableWebserviceProxy,
42+
ValidateChildStyleNameEqual: src.ValidateChildStyleNameEqual,
43+
}
1944
}
2045

2146
func ConverseAutoscaling(src Autoscaling) *autoscalingv2.HorizontalPodAutoscalerSpec {
@@ -89,3 +114,128 @@ func ConverseColumnsWithAliasV3ToColumnsAndAliasesV2(columns []pdoknlv3.Columns)
89114

90115
return v2Columns, v2Aliases
91116
}
117+
118+
func ConverseV2DataToV3(v2 Data) pdoknlv3.Data {
119+
v3 := pdoknlv3.Data{}
120+
121+
if v2.GPKG != nil {
122+
v3.Gpkg = &pdoknlv3.Gpkg{
123+
BlobKey: v2.GPKG.BlobKey,
124+
TableName: v2.GPKG.Table,
125+
GeometryType: v2.GPKG.GeometryType,
126+
Columns: ConverseColumnAndAliasesV2ToColumnsWithAliasV3(
127+
v2.GPKG.Columns,
128+
v2.GPKG.Aliases,
129+
),
130+
}
131+
}
132+
133+
if v2.Postgis != nil {
134+
v3.Postgis = &pdoknlv3.Postgis{
135+
TableName: v2.Postgis.Table,
136+
GeometryType: v2.Postgis.GeometryType,
137+
Columns: ConverseColumnAndAliasesV2ToColumnsWithAliasV3(
138+
v2.Postgis.Columns,
139+
v2.Postgis.Aliases,
140+
),
141+
}
142+
}
143+
144+
if v2.Tif != nil {
145+
v3.TIF = &pdoknlv3.TIF{
146+
BlobKey: v2.Tif.BlobKey,
147+
Resample: v2.Tif.Resample,
148+
Offsite: v2.Tif.Offsite,
149+
GetFeatureInfoIncludesClass: v2.Tif.GetFeatureInfoIncludesClass,
150+
}
151+
}
152+
153+
return v3
154+
}
155+
156+
func ConverseV3DataToV2(v3 pdoknlv3.Data) Data {
157+
v2 := Data{}
158+
159+
if v3.Gpkg != nil {
160+
columns, aliases := ConverseColumnsWithAliasV3ToColumnsAndAliasesV2(v3.Gpkg.Columns)
161+
v2.GPKG = &GPKG{
162+
BlobKey: v3.Gpkg.BlobKey,
163+
Table: v3.Gpkg.TableName,
164+
GeometryType: v3.Gpkg.GeometryType,
165+
Columns: columns,
166+
Aliases: aliases,
167+
}
168+
}
169+
170+
if v3.Postgis != nil {
171+
columns, aliases := ConverseColumnsWithAliasV3ToColumnsAndAliasesV2(v3.Postgis.Columns)
172+
v2.Postgis = &Postgis{
173+
Table: v3.Postgis.TableName,
174+
GeometryType: v3.Postgis.GeometryType,
175+
Columns: columns,
176+
Aliases: aliases,
177+
}
178+
}
179+
180+
if v3.TIF != nil {
181+
v2.Tif = &Tif{
182+
BlobKey: v3.TIF.BlobKey,
183+
Offsite: v3.TIF.Offsite,
184+
Resample: v3.TIF.Resample,
185+
GetFeatureInfoIncludesClass: v3.TIF.GetFeatureInfoIncludesClass,
186+
}
187+
}
188+
189+
return v2
190+
}
191+
192+
func NewV2KubernetesObject(lifecycle *shared_model.Lifecycle, podSpecPatch *corev1.PodSpec, scalingSpec *autoscalingv2.HorizontalPodAutoscalerSpec) Kubernetes {
193+
kub := Kubernetes{}
194+
195+
if lifecycle != nil && lifecycle.TTLInDays != nil {
196+
kub.Lifecycle = &Lifecycle{
197+
TTLInDays: Pointer(int(*lifecycle.TTLInDays)),
198+
}
199+
}
200+
201+
// TODO - healthcheck
202+
if podSpecPatch != nil {
203+
kub.Resources = &podSpecPatch.Containers[0].Resources
204+
}
205+
206+
if scalingSpec != nil {
207+
kub.Autoscaling = &Autoscaling{
208+
MaxReplicas: Pointer(int(scalingSpec.MaxReplicas)),
209+
}
210+
211+
if scalingSpec.MinReplicas != nil {
212+
kub.Autoscaling.MinReplicas = Pointer(int(*scalingSpec.MinReplicas))
213+
}
214+
215+
if scalingSpec.Metrics != nil {
216+
kub.Autoscaling.AverageCPUUtilization = Pointer(
217+
int(*scalingSpec.Metrics[0].Resource.TargetAverageUtilization),
218+
)
219+
}
220+
}
221+
222+
return kub
223+
}
224+
225+
func LabelsToV2General(labels map[string]string) General {
226+
general := General{
227+
Dataset: labels["dataset"],
228+
DatasetOwner: labels["dataset-owner"],
229+
DataVersion: nil,
230+
}
231+
232+
if serviceVersion, ok := labels["service-version"]; ok {
233+
general.ServiceVersion = &serviceVersion
234+
}
235+
236+
if theme, ok := labels["theme"]; ok {
237+
general.Theme = &theme
238+
}
239+
240+
return general
241+
}

api/v2beta1/wfs_conversion.go

Lines changed: 9 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,9 @@ func (src *WFS) ConvertTo(dstRaw conversion.Hub) error {
5757
dst.Spec.PodSpecPatch = ConverseResources(*src.Spec.Kubernetes.Resources)
5858
}
5959

60-
dst.Spec.Options = &pdoknlv3.Options{
61-
AutomaticCasing: src.Spec.Options.AutomaticCasing,
62-
PrefetchData: PointerValWithDefault(src.Spec.Options.PrefetchData, false),
63-
IncludeIngress: src.Spec.Options.IncludeIngress,
64-
}
60+
dst.Spec.Options = ConverseOptionsV2ToV3(src.Spec.Options)
6561

66-
service := pdoknlv3.Service{
62+
service := pdoknlv3.WFSService{
6763
Prefix: "",
6864
BaseURL: "https://service.pdok.nl",
6965
OwnerInfoRef: "pdok",
@@ -141,28 +137,7 @@ func convertV2FeatureTypeToV3(src FeatureType) pdoknlv3.FeatureType {
141137
}
142138
}
143139

144-
if src.Data.GPKG != nil {
145-
featureTypeV3.Data.Gpkg = &pdoknlv3.Gpkg{
146-
BlobKey: src.Data.GPKG.BlobKey,
147-
TableName: src.Data.GPKG.Table,
148-
GeometryType: src.Data.GPKG.GeometryType,
149-
Columns: ConverseColumnAndAliasesV2ToColumnsWithAliasV3(
150-
src.Data.GPKG.Columns,
151-
src.Data.GPKG.Aliases,
152-
),
153-
}
154-
}
155-
156-
if src.Data.Postgis != nil {
157-
featureTypeV3.Data.Postgis = &pdoknlv3.Postgis{
158-
TableName: src.Data.Postgis.Table,
159-
GeometryType: src.Data.Postgis.GeometryType,
160-
Columns: ConverseColumnAndAliasesV2ToColumnsWithAliasV3(
161-
src.Data.Postgis.Columns,
162-
src.Data.Postgis.Aliases,
163-
),
164-
}
165-
}
140+
featureTypeV3.Data = ConverseV2DataToV3(src.Data)
166141

167142
return featureTypeV3
168143
}
@@ -177,55 +152,12 @@ func (dst *WFS) ConvertFrom(srcRaw conversion.Hub) error {
177152

178153
dst.ObjectMeta = src.ObjectMeta
179154

180-
dst.Spec.General = General{
181-
Dataset: src.ObjectMeta.Labels["dataset"],
182-
DatasetOwner: src.ObjectMeta.Labels["dataset-owner"],
183-
DataVersion: nil,
184-
}
185-
186-
if serviceVersion, ok := src.ObjectMeta.Labels["service-version"]; ok {
187-
dst.Spec.General.ServiceVersion = &serviceVersion
188-
}
189-
190-
if theme, ok := src.ObjectMeta.Labels["theme"]; ok {
191-
dst.Spec.General.Theme = &theme
192-
}
193-
194-
dst.Spec.Kubernetes = Kubernetes{}
195-
196-
if src.Spec.Lifecycle != nil && src.Spec.Lifecycle.TTLInDays != nil {
197-
dst.Spec.Kubernetes.Lifecycle = &Lifecycle{
198-
TTLInDays: Pointer(int(*src.Spec.Lifecycle.TTLInDays)),
199-
}
200-
}
201-
202-
// TODO - healthcheck
203-
if src.Spec.PodSpecPatch != nil {
204-
dst.Spec.Kubernetes.Resources = &src.Spec.PodSpecPatch.Containers[0].Resources
205-
}
206-
207-
if src.Spec.HorizontalPodAutoscalerPatch != nil {
208-
dst.Spec.Kubernetes.Autoscaling = &Autoscaling{
209-
MaxReplicas: Pointer(int(src.Spec.HorizontalPodAutoscalerPatch.MaxReplicas)),
210-
}
211-
212-
if src.Spec.HorizontalPodAutoscalerPatch.MinReplicas != nil {
213-
dst.Spec.Kubernetes.Autoscaling.MinReplicas = Pointer(int(*src.Spec.HorizontalPodAutoscalerPatch.MinReplicas))
214-
}
155+
dst.Spec.General = LabelsToV2General(src.ObjectMeta.Labels)
215156

216-
if src.Spec.HorizontalPodAutoscalerPatch.Metrics != nil {
217-
dst.Spec.Kubernetes.Autoscaling.AverageCPUUtilization = Pointer(
218-
int(*src.Spec.HorizontalPodAutoscalerPatch.Metrics[0].Resource.TargetAverageUtilization),
219-
)
220-
}
221-
}
157+
dst.Spec.Kubernetes = NewV2KubernetesObject(src.Spec.Lifecycle, src.Spec.PodSpecPatch, src.Spec.HorizontalPodAutoscalerPatch)
222158

223-
if src.Spec.Options == nil {
224-
dst.Spec.Options = WMSWFSOptions{
225-
AutomaticCasing: src.Spec.Options.AutomaticCasing,
226-
PrefetchData: &src.Spec.Options.PrefetchData,
227-
IncludeIngress: src.Spec.Options.IncludeIngress,
228-
}
159+
if src.Spec.Options != nil {
160+
dst.Spec.Options = ConverseOptionsV3ToV2(src.Spec.Options)
229161
}
230162

231163
service := WFSService{
@@ -258,6 +190,7 @@ func (dst *WFS) ConvertFrom(srcRaw conversion.Hub) error {
258190
service.MetadataIdentifier = src.Spec.Service.Inspire.ServiceMetadataURL.CSW.MetadataIdentifier
259191
} else {
260192
service.Inspire = false
193+
// TODO unable to fill in MetadataIdentifier here untill we know how to handle non inspire services
261194
}
262195

263196
for _, featureType := range src.Spec.Service.FeatureTypes {
@@ -268,7 +201,7 @@ func (dst *WFS) ConvertFrom(srcRaw conversion.Hub) error {
268201
Keywords: featureType.Keywords,
269202
DatasetMetadataIdentifier: featureType.DatasetMetadataURL.CSW.MetadataIdentifier,
270203
SourceMetadataIdentifier: "",
271-
Data: Data{},
204+
Data: ConverseV3DataToV2(featureType.Data),
272205
}
273206

274207
if src.Spec.Service.Inspire != nil {
@@ -279,27 +212,6 @@ func (dst *WFS) ConvertFrom(srcRaw conversion.Hub) error {
279212
featureTypeV2.Extent = Pointer(featureType.Bbox.DefaultCRS.ToExtent())
280213
}
281214

282-
if featureType.Data.Gpkg != nil {
283-
columns, aliases := ConverseColumnsWithAliasV3ToColumnsAndAliasesV2(featureType.Data.Gpkg.Columns)
284-
featureTypeV2.Data.GPKG = &GPKG{
285-
BlobKey: featureType.Data.Gpkg.BlobKey,
286-
Table: featureType.Data.Gpkg.TableName,
287-
GeometryType: featureType.Data.Gpkg.GeometryType,
288-
Columns: columns,
289-
Aliases: aliases,
290-
}
291-
}
292-
293-
if featureType.Data.Postgis != nil {
294-
columns, aliases := ConverseColumnsWithAliasV3ToColumnsAndAliasesV2(featureType.Data.Postgis.Columns)
295-
featureTypeV2.Data.Postgis = &Postgis{
296-
Table: featureType.Data.Postgis.TableName,
297-
GeometryType: featureType.Data.Postgis.GeometryType,
298-
Columns: columns,
299-
Aliases: aliases,
300-
}
301-
}
302-
303215
service.FeatureTypes = append(service.FeatureTypes, featureTypeV2)
304216
}
305217

0 commit comments

Comments
 (0)