Skip to content

Commit d9d1d58

Browse files
authored
Merge pull request #26 from PDOK/PDOK-17793-wfs-molecule-tests
Pdok 17793 Added several tests to mimic molecule tests
2 parents 66d2f85 + f8fd125 commit d9d1d58

File tree

4 files changed

+155
-8
lines changed

4 files changed

+155
-8
lines changed

api/v2beta1/shared_conversion.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,20 @@ func ConvertAutoscaling(src Autoscaling) *autoscalingv2.HorizontalPodAutoscalerS
7979
}
8080

8181
func ConvertResources(src corev1.ResourceRequirements) *corev1.PodSpec {
82+
targetResources := src
83+
84+
if src.Requests != nil {
85+
targetResources.Requests[corev1.ResourceEphemeralStorage] = src.Requests["ephemeralStorage"]
86+
}
87+
if src.Limits != nil {
88+
targetResources.Limits[corev1.ResourceEphemeralStorage] = src.Limits["ephemeralStorage"]
89+
}
90+
8291
return &corev1.PodSpec{
8392
Containers: []corev1.Container{
8493
{
8594
Name: "mapserver",
86-
Resources: src,
95+
Resources: targetResources,
8796
},
8897
},
8998
}

internal/controller/mapperutils/utils.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,13 @@ func ephemeralStorage[O pdoknlv3.WMSWFS](obj O, limit bool) *resource.Quantity {
3333
for _, container := range obj.PodSpecPatch().Containers {
3434
if container.Name == "mapserver" {
3535
if limit {
36-
return container.Resources.Limits.StorageEphemeral()
36+
limitVal := container.Resources.Limits.StorageEphemeral()
37+
if !limitVal.IsZero() {
38+
return limitVal
39+
}
40+
} else if !container.Resources.Requests.StorageEphemeral().IsZero() {
41+
return container.Resources.Requests.StorageEphemeral()
3742
}
38-
39-
return container.Resources.Requests.StorageEphemeral()
4043
}
4144
}
4245

internal/controller/mapserver/deployment.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ func GetEnvVarsForDeployment[O pdoknlv3.WMSWFS](obj O, blobsSecretName string) [
217217
}
218218
}
219219

220+
// Resources for mapserver container
220221
func GetResourcesForDeployment[O pdoknlv3.WMSWFS](obj O) v1.ResourceRequirements {
221222
minimumEphemeralStorageLimit := resource.MustParse("200M")
222223
resources := v1.ResourceRequirements{
@@ -230,8 +231,20 @@ func GetResourcesForDeployment[O pdoknlv3.WMSWFS](obj O) v1.ResourceRequirements
230231
}
231232

232233
objResources := &v1.ResourceRequirements{}
233-
if obj.PodSpecPatch() != nil && obj.PodSpecPatch().Resources != nil {
234-
objResources = obj.PodSpecPatch().Resources
234+
if obj.PodSpecPatch() != nil {
235+
found := false
236+
for _, container := range obj.PodSpecPatch().Containers {
237+
if container.Name == "mapserver" {
238+
objResources = &container.Resources
239+
found = true
240+
break
241+
}
242+
}
243+
244+
if !found && obj.PodSpecPatch().Resources != nil {
245+
objResources = obj.PodSpecPatch().Resources
246+
}
247+
235248
}
236249

237250
if obj.Type() == pdoknlv3.ServiceTypeWMS && obj.Options().UseWebserviceProxy() {
@@ -242,14 +255,14 @@ func GetResourcesForDeployment[O pdoknlv3.WMSWFS](obj O) v1.ResourceRequirements
242255
resources.Limits[v1.ResourceCPU] = *objResources.Limits.Cpu()
243256
}
244257

245-
if objResources.Requests.Memory() != nil {
258+
if objResources.Requests.Memory() != nil && !objResources.Requests.Memory().IsZero() {
246259
resources.Requests[v1.ResourceMemory] = *objResources.Requests.Memory()
247260
}
248261

249262
if use, _ := mapperutils.UseEphemeralVolume(obj); !use {
250263
value := mapperutils.EphemeralStorageLimit(obj)
251264

252-
if value.Value() > minimumEphemeralStorageLimit.Value() {
265+
if objResources.Limits.StorageEphemeral() != nil && objResources.Limits.StorageEphemeral().Value() > minimumEphemeralStorageLimit.Value() {
253266
resources.Limits[v1.ResourceEphemeralStorage] = *value
254267
}
255268
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package mapserver
2+
3+
import (
4+
"encoding/json"
5+
"github.com/pdok/mapserver-operator/api/v2beta1"
6+
pdoknlv3 "github.com/pdok/mapserver-operator/api/v3"
7+
"github.com/pdok/mapserver-operator/internal/controller/types"
8+
"github.com/stretchr/testify/assert"
9+
v1 "k8s.io/api/core/v1"
10+
"k8s.io/apimachinery/pkg/api/resource"
11+
"sigs.k8s.io/yaml"
12+
"testing"
13+
)
14+
15+
const (
16+
v2WfsString = "apiVersion: pdok.nl/v2beta1\nkind: WFS\nmetadata:\n name: rws-nwbwegen-v1-0\n labels:\n dataset-owner: rws\n dataset: nwbwegen\n service-version: v1_0\n service-type: wfs\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 mimetype: text/xml\n querystring: SERVICE=WFS&VERSION=2.0.0&REQUEST=GetCapabilities\n resources:\n limits:\n ephemeralStorage: 1505Mi\n requests:\n ephemeralStorage: 1505Mi\n service:\n title: NWB - Wegen WFS\n abstract:\n Dit is de web feature service van het Nationaal Wegen Bestand (NWB)\n - wegen. Deze dataset bevat alleen de wegvakken en hectometerpunten. Het Nationaal\n Wegen Bestand - Wegen is een digitaal geografisch bestand van alle wegen in\n Nederland. Opgenomen zijn alle wegen die worden beheerd door wegbeheerders als\n het Rijk, provincies, gemeenten en waterschappen, echter alleen voor zover deze\n zijn voorzien van een straatnaam of nummer.\n inspire: true\n metadataIdentifier: a9fa7fff-6365-4885-950c-e9d9848359ee\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 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 featureTypes:\n - name: wegvakken\n title: Wegvakken\n abstract:\n Dit featuretype bevat de wegvakken uit het Nationaal Wegen bestand\n (NWB) en bevat gedetailleerde informatie per wegvak zoals straatnaam, wegnummer,\n routenummer, wegbeheerder, huisnummers, enz.\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\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 data:\n gpkg:\n table: wegvakken\n geometryType: MultiLineString\n blobKey: geopackages/rws/nwbwegen/1c56dc48-2cf4-4631-8b09-ed385d5368d1/1/nwb_wegen.gpkg\n columns:\n - fid\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 - name: hectopunten\n title: Hectopunten\n abstract:\n Dit featuretype bevat de hectopunten uit het Nationaal Wegen Bestand\n (NWB) en bevat gedetailleerde informatie per hectopunt zoals hectometrering,\n afstand, zijde en hectoletter.\n sourceMetadataIdentifier: 8f0497f0-dbd7-4bee-b85a-5fdec484a7ff\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 data:\n gpkg:\n blobKey: geopackages/rws/nwbwegen/1c56dc48-2cf4-4631-8b09-ed385d5368d1/1/nwb_wegen.gpkg\n columns:\n - fid\n - objectid\n - hectomtrng\n - afstand\n - wvk_id\n - wvk_begdat\n - zijde\n - hecto_lttr\n geometryType: MultiPoint\n table: hectopunten\n"
17+
expectedVolumeMountsString = "[{\"name\":\"base\",\"mountPath\":\"/srv/data\"},{\"name\":\"data\",\"mountPath\":\"/var/www\"},{\"name\":\"mapserver\",\"mountPath\":\"/srv/mapserver/config/default_mapserver.conf\",\"subPath\":\"default_mapserver.conf\"},{\"name\":\"mapserver\",\"mountPath\":\"/srv/mapserver/config/include.conf\",\"subPath\":\"include.conf\"},{\"name\":\"mapserver\",\"mountPath\":\"/srv/mapserver/config/ogc.lua\",\"subPath\":\"ogc.lua\"},{\"name\":\"mapserver\",\"mountPath\":\"/srv/mapserver/config/scraping-error.xml\",\"subPath\":\"scraping-error.xml\"}]"
18+
expectedEnvVarsString = "[{\"name\":\"SERVICE_TYPE\",\"value\":\"WFS\"},{\"name\":\"MAPSERVER_CONFIG_FILE\",\"value\":\"/srv/mapserver/config/default_mapserver.conf\"},{\"name\":\"AZURE_STORAGE_CONNECTION_STRING\",\"valueFrom\":{\"secretKeyRef\":{\"name\":\"blobs-secret\",\"key\":\"AZURE_STORAGE_CONNECTION_STRING\"}}},{\"name\":\"MS_MAPFILE\",\"value\":\"/srv/data/config/mapfile/service.map\"}]\n"
19+
expectedLivenessProbeString = "{\"exec\":{\"command\":[\"/bin/sh\",\"-c\",\"wget -SO- -T 10 -t 2 'http://127.0.0.1:80/mapserver?SERVICE=wfs\\u0026request=GetCapabilities' 2\\u003e\\u00261 | egrep -aiA10 'HTTP/1.1 200' | egrep -i 'Content-Type: text/xml'\"]},\"initialDelaySeconds\":20,\"timeoutSeconds\":10,\"periodSeconds\":10,\"successThreshold\":1,\"failureThreshold\":3}\n"
20+
expectedReadinessProbeString = "{\"exec\":{\"command\":[\"/bin/sh\",\"-c\",\"wget -SO- -T 10 -t 2 'http://127.0.0.1:80/mapserver?SERVICE=WFS\\u0026VERSION=2.0.0\\u0026REQUEST=GetFeature\\u0026TYPENAMES=wegvakken\\u0026STARTINDEX=0\\u0026COUNT=1' 2\\u003e\\u00261 | egrep -aiA10 'HTTP/1.1 200' | egrep -i 'Content-Type: text/xml'\"]},\"initialDelaySeconds\":20,\"timeoutSeconds\":10,\"periodSeconds\":10,\"successThreshold\":1,\"failureThreshold\":3}\n"
21+
expectedStartupProbeString = "{\"exec\":{\"command\":[\"/bin/sh\",\"-c\",\"wget -SO- -T 10 -t 2 'http://127.0.0.1:80/mapserver?SERVICE=WFS\\u0026VERSION=2.0.0\\u0026REQUEST=GetFeature\\u0026TYPENAMES=wegvakken,hectopunten\\u0026STARTINDEX=0\\u0026COUNT=1' 2\\u003e\\u00261 | egrep -aiA10 'HTTP/1.1 200' | egrep -i 'Content-Type: text/xml'\"]},\"initialDelaySeconds\":20,\"timeoutSeconds\":10,\"periodSeconds\":10,\"successThreshold\":1,\"failureThreshold\":3}\n"
22+
)
23+
24+
func TestGetVolumeMountsForDeployment(t *testing.T) {
25+
var wfs = getV3()
26+
pdoknlv3.SetHost("https://service.pdok.nl")
27+
result := GetVolumeMountsForDeployment(wfs, "/srv")
28+
29+
var expectedVolumeMounts []v1.VolumeMount
30+
err := json.Unmarshal([]byte(expectedVolumeMountsString), &expectedVolumeMounts)
31+
assert.NoError(t, err)
32+
assert.Equal(t, expectedVolumeMounts, result)
33+
}
34+
35+
func TestGetEnvVarsForDeployment(t *testing.T) {
36+
var wfs = getV3()
37+
pdoknlv3.SetHost("https://service.pdok.nl")
38+
result := GetEnvVarsForDeployment(wfs, "blobs-secret")
39+
var expectedEnvVars []v1.EnvVar
40+
err := json.Unmarshal([]byte(expectedEnvVarsString), &expectedEnvVars)
41+
assert.NoError(t, err)
42+
assert.Equal(t, expectedEnvVars, result)
43+
}
44+
45+
func TestGetResourcesForDeployment(t *testing.T) {
46+
var wfs = getV3()
47+
pdoknlv3.SetHost("https://service.pdok.nl")
48+
result := GetResourcesForDeployment(wfs)
49+
50+
expectedLimits := v1.ResourceList{}
51+
expectedRequest := v1.ResourceList{}
52+
53+
expectedLimits[v1.ResourceMemory] = resource.MustParse("800M")
54+
expectedLimits[v1.ResourceEphemeralStorage] = resource.MustParse("1505Mi")
55+
56+
expectedRequest[v1.ResourceCPU] = resource.MustParse("0.15")
57+
expectedRequest[v1.ResourceEphemeralStorage] = resource.MustParse("1505Mi")
58+
59+
var expected = v1.ResourceRequirements{
60+
Limits: expectedLimits,
61+
Requests: expectedRequest,
62+
Claims: nil,
63+
}
64+
65+
assert.Equal(t, expected, result)
66+
}
67+
68+
func TestGetProbesForDeployment(t *testing.T) {
69+
var wfs = getV3()
70+
pdoknlv3.SetHost("https://service.pdok.nl")
71+
livenessResult, readinessResult, startupResult, err := GetProbesForDeployment(wfs)
72+
assert.NoError(t, err)
73+
var expectedLiveness v1.Probe
74+
var expectedReadiness v1.Probe
75+
var expectedStartup v1.Probe
76+
err = json.Unmarshal([]byte(expectedLivenessProbeString), &expectedLiveness)
77+
assert.NoError(t, err)
78+
err = json.Unmarshal([]byte(expectedReadinessProbeString), &expectedReadiness)
79+
assert.NoError(t, err)
80+
err = json.Unmarshal([]byte(expectedStartupProbeString), &expectedStartup)
81+
assert.NoError(t, err)
82+
assert.Equal(t, &expectedLiveness, livenessResult)
83+
assert.Equal(t, &expectedReadiness, readinessResult)
84+
assert.Equal(t, &expectedStartup, startupResult)
85+
}
86+
87+
func TestGetVolumesForDeployment(t *testing.T) {
88+
var wfs = getV3()
89+
pdoknlv3.SetHost("https://service.pdok.nl")
90+
91+
hashedConfigMapNames := types.HashedConfigMapNames{
92+
ConfigMap: "rws-nwbwegen-v1-0-wfs-mapserver-bb59c7f4f4",
93+
BlobDownload: "2",
94+
MapfileGenerator: "rws-nwbwegen-v1-0-wfs-mapfile-generator-bbbtd999dh",
95+
CapabilitiesGenerator: "rws-nwbwegen-v1-0-wfs-capabilities-generator-6m4mfkgb5d",
96+
OgcWebserviceProxy: "3",
97+
LegendGenerator: "4",
98+
FeatureInfoGenerator: "5",
99+
}
100+
result := GetVolumesForDeployment(wfs, hashedConfigMapNames)
101+
102+
expected := []v1.Volume{
103+
{Name: "base", VolumeSource: v1.VolumeSource{EmptyDir: &v1.EmptyDirVolumeSource{}}},
104+
{Name: "data", VolumeSource: v1.VolumeSource{EmptyDir: &v1.EmptyDirVolumeSource{}}},
105+
{Name: "mapserver", VolumeSource: v1.VolumeSource{ConfigMap: &v1.ConfigMapVolumeSource{LocalObjectReference: v1.LocalObjectReference{Name: "rws-nwbwegen-v1-0-wfs-mapserver-bb59c7f4f4"}, DefaultMode: v2beta1.Pointer(int32(420))}}},
106+
{Name: "mapfile-generator-config", VolumeSource: v1.VolumeSource{ConfigMap: &v1.ConfigMapVolumeSource{LocalObjectReference: v1.LocalObjectReference{Name: "rws-nwbwegen-v1-0-wfs-mapfile-generator-bbbtd999dh"}, DefaultMode: v2beta1.Pointer(int32(420))}}},
107+
{Name: "capabilities-generator-config", VolumeSource: v1.VolumeSource{ConfigMap: &v1.ConfigMapVolumeSource{LocalObjectReference: v1.LocalObjectReference{Name: "rws-nwbwegen-v1-0-wfs-capabilities-generator-6m4mfkgb5d"}, DefaultMode: v2beta1.Pointer(int32(420))}}},
108+
}
109+
110+
assert.Equal(t, expected, result)
111+
}
112+
113+
func getV3() *pdoknlv3.WFS {
114+
var v2wfs v2beta1.WFS
115+
err := yaml.Unmarshal([]byte(v2WfsString), &v2wfs)
116+
if err != nil {
117+
panic(err)
118+
}
119+
var wfs pdoknlv3.WFS
120+
v2wfs.ToV3(&wfs)
121+
return &wfs
122+
}

0 commit comments

Comments
 (0)